github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/ordered_map_O_test.go (about)

     1  package collections
     2  
     3  import (
     4  	"runtime"
     5  	"sort"
     6  	"testing"
     7  )
     8  
     9  type tester interface {
    10  	has(int) bool
    11  }
    12  
    13  type mapTester struct {
    14  	m map[int]bool
    15  }
    16  
    17  func (m *mapTester) has(x int) bool {
    18  	_, ok := m.m[x]
    19  	return ok
    20  }
    21  
    22  type sliceTester struct {
    23  	s []int
    24  }
    25  
    26  func (s *sliceTester) has(x int) bool {
    27  	// sort.Search 使用的是二分查找
    28  	i := sort.Search(len(s.s), func(i int) bool { return s.s[i] >= x })
    29  	// 未找到时 i 为 -1
    30  	return i < len(s.s) && s.s[i] == x
    31  }
    32  
    33  func genMap(size int) tester {
    34  	m := map[int]bool{}
    35  	for i := 0; i < size; i++ {
    36  		m[i] = true
    37  	}
    38  	return &mapTester{m: m}
    39  }
    40  
    41  func genSlice(size int) tester {
    42  	s := make([]int, size)
    43  	for i := 0; i < size; i++ {
    44  		s[i] = i
    45  	}
    46  	return &sliceTester{s: s}
    47  }
    48  
    49  func benchmark(r tester, b *testing.B) {
    50  	runtime.GC()
    51  	b.ResetTimer()
    52  
    53  	for i := 0; i < b.N; i++ {
    54  		r.has(i)
    55  	}
    56  }
    57  
    58  func BenchmarkMap10e1(b *testing.B)   { benchmark(genMap(10e1), b) }
    59  func BenchmarkSlice10e1(b *testing.B) { benchmark(genSlice(10e1), b) }
    60  func BenchmarkMap10e2(b *testing.B)   { benchmark(genMap(10e2), b) }
    61  func BenchmarkSlice10e2(b *testing.B) { benchmark(genSlice(10e2), b) }
    62  func BenchmarkMap10e3(b *testing.B)   { benchmark(genMap(10e3), b) }
    63  func BenchmarkSlice10e3(b *testing.B) { benchmark(genSlice(10e3), b) }
    64  func BenchmarkMap10e4(b *testing.B)   { benchmark(genMap(10e4), b) }
    65  func BenchmarkSlice10e4(b *testing.B) { benchmark(genSlice(10e4), b) }
    66  func BenchmarkMap10e5(b *testing.B)   { benchmark(genMap(10e5), b) }
    67  func BenchmarkSlice10e5(b *testing.B) { benchmark(genSlice(10e5), b) }
    68  func BenchmarkMap10e6(b *testing.B)   { benchmark(genMap(10e6), b) }
    69  func BenchmarkSlice10e6(b *testing.B) { benchmark(genSlice(10e6), b) }