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) }