github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/utils/iteration_test.go (about) 1 package utils 2 3 import ( 4 "context" 5 "fmt" 6 "sync" 7 "testing" 8 "time" 9 ) 10 11 func TestIterateOverMap(t *testing.T) { 12 type testStruct struct { 13 value bool 14 } 15 itemCount := 100 16 target := make(map[int]testStruct, itemCount) 17 result := make([]struct { 18 key int 19 value testStruct 20 }, 0, itemCount) 21 for i := 0; i < itemCount; i++ { 22 target[i] = testStruct{value: false} 23 } 24 var mu sync.Mutex 25 errorChan := make(chan error) 26 IterateOverMap(context.Background(), errorChan, target, func(key int, value testStruct) error { 27 mu.Lock() 28 defer mu.Unlock() 29 item := target[key] 30 item.value = true 31 result = append(result, struct { 32 key int 33 value testStruct 34 }{key: key, value: item}) 35 // target[key] = item 36 return nil 37 }) 38 39 if err := <-errorChan; err != nil { 40 t.Fatal(err) 41 } 42 43 fmt.Printf("%+v\n", target) 44 // for key, value := range target { 45 for _, v := range result { 46 if !v.value.value { 47 t.Fatal("wrong value (false) for key", v.key) 48 } 49 } 50 } 51 52 var benchmarkItemCount = 13000 53 54 func BenchmarkSync(b *testing.B) { 55 target := make(map[int]bool, benchmarkItemCount) 56 for j := 0; j < benchmarkItemCount; j++ { 57 target[j] = true 58 } 59 60 for i := 0; i < b.N; i++ { 61 for _, v := range target { 62 time.Sleep(5 * time.Millisecond) 63 _ = v 64 } 65 } 66 } 67 68 func BenchmarkIterateOverMap(b *testing.B) { 69 target := make(map[int]bool, benchmarkItemCount) 70 for j := 0; j < benchmarkItemCount; j++ { 71 target[j] = true 72 } 73 74 ctx := context.Background() 75 errorChan := make(chan error) 76 for i := 0; i < b.N; i++ { 77 IterateOverMap(ctx, errorChan, target, func(key int, value bool) error { 78 time.Sleep(5 * time.Millisecond) 79 return nil 80 }) 81 82 if err := <-errorChan; err != nil { 83 b.Fatal(err) 84 } 85 } 86 }