• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package slices_test
6
7import (
8	"cmp"
9	"fmt"
10	"slices"
11	"strings"
12	"testing"
13)
14
15func BenchmarkBinarySearchFloats(b *testing.B) {
16	for _, size := range []int{16, 32, 64, 128, 512, 1024} {
17		b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {
18			floats := make([]float64, size)
19			for i := range floats {
20				floats[i] = float64(i)
21			}
22			midpoint := len(floats) / 2
23			needle := (floats[midpoint] + floats[midpoint+1]) / 2
24			b.ResetTimer()
25			for i := 0; i < b.N; i++ {
26				slices.BinarySearch(floats, needle)
27			}
28		})
29	}
30}
31
32type myStruct struct {
33	a, b, c, d string
34	n          int
35}
36
37func BenchmarkBinarySearchFuncStruct(b *testing.B) {
38	for _, size := range []int{16, 32, 64, 128, 512, 1024} {
39		b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {
40			structs := make([]*myStruct, size)
41			for i := range structs {
42				structs[i] = &myStruct{n: i}
43			}
44			midpoint := len(structs) / 2
45			needle := &myStruct{n: (structs[midpoint].n + structs[midpoint+1].n) / 2}
46			cmpFunc := func(a, b *myStruct) int { return a.n - b.n }
47			b.ResetTimer()
48			for i := 0; i < b.N; i++ {
49				slices.BinarySearchFunc(structs, needle, cmpFunc)
50			}
51		})
52	}
53}
54
55func BenchmarkSortFuncStruct(b *testing.B) {
56	for _, size := range []int{16, 32, 64, 128, 512, 1024} {
57		b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {
58			structs := make([]*myStruct, size)
59			for i := range structs {
60				structs[i] = &myStruct{
61					a: fmt.Sprintf("string%d", i%10),
62					n: i * 11 % size,
63				}
64			}
65			cmpFunc := func(a, b *myStruct) int {
66				if n := strings.Compare(a.a, b.a); n != 0 {
67					return n
68				}
69				return cmp.Compare(a.n, b.n)
70			}
71			// Presort the slice so all benchmark iterations are identical.
72			slices.SortFunc(structs, cmpFunc)
73			b.ResetTimer()
74			for i := 0; i < b.N; i++ {
75				// Sort the slice twice because slices.SortFunc modifies the slice in place.
76				slices.SortFunc(structs, func(a, b *myStruct) int { return cmpFunc(b, a) })
77				slices.SortFunc(structs, cmpFunc)
78			}
79		})
80	}
81}
82