mirror of https://go.googlesource.com/go
82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
// 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)
|
|
}
|
|
})
|
|
}
|
|
}
|