// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package slices_test import ( "cmp" "fmt" "slices" "strings" "testing" ) func BenchmarkBinarySearchFloats(b *testing.B) { for _, size := range []int{16, 32, 64, 128, 512, 1024} { b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) { floats := make([]float64, size) for i := range floats { floats[i] = float64(i) } midpoint := len(floats) / 2 needle := (floats[midpoint] + floats[midpoint+1]) / 2 b.ResetTimer() for i := 0; i < b.N; i++ { slices.BinarySearch(floats, needle) } }) } } type myStruct struct { a, b, c, d string n int } func BenchmarkBinarySearchFuncStruct(b *testing.B) { for _, size := range []int{16, 32, 64, 128, 512, 1024} { b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) { structs := make([]*myStruct, size) for i := range structs { structs[i] = &myStruct{n: i} } midpoint := len(structs) / 2 needle := &myStruct{n: (structs[midpoint].n + structs[midpoint+1].n) / 2} cmpFunc := func(a, b *myStruct) int { return a.n - b.n } b.ResetTimer() for i := 0; i < b.N; i++ { slices.BinarySearchFunc(structs, needle, cmpFunc) } }) } } func BenchmarkSortFuncStruct(b *testing.B) { for _, size := range []int{16, 32, 64, 128, 512, 1024} { b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) { structs := make([]*myStruct, size) for i := range structs { structs[i] = &myStruct{ a: fmt.Sprintf("string%d", i%10), n: i * 11 % size, } } cmpFunc := func(a, b *myStruct) int { if n := strings.Compare(a.a, b.a); n != 0 { return n } return cmp.Compare(a.n, b.n) } // Presort the slice so all benchmark iterations are identical. slices.SortFunc(structs, cmpFunc) b.ResetTimer() for i := 0; i < b.N; i++ { // Sort the slice twice because slices.SortFunc modifies the slice in place. slices.SortFunc(structs, func(a, b *myStruct) int { return cmpFunc(b, a) }) slices.SortFunc(structs, cmpFunc) } }) } }