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  }