1// Copyright 2024 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 unique
6
7import (
8	"fmt"
9	"runtime"
10	"testing"
11)
12
13func BenchmarkMake(b *testing.B) {
14	benchmarkMake(b, []string{"foo"})
15}
16
17func BenchmarkMakeMany(b *testing.B) {
18	benchmarkMake(b, testData[:])
19}
20
21func BenchmarkMakeManyMany(b *testing.B) {
22	benchmarkMake(b, testDataLarge[:])
23}
24
25func benchmarkMake(b *testing.B, testData []string) {
26	handles := make([]Handle[string], 0, len(testData))
27	for i := range testData {
28		handles = append(handles, Make(testData[i]))
29	}
30
31	b.ReportAllocs()
32	b.ResetTimer()
33
34	b.RunParallel(func(pb *testing.PB) {
35		i := 0
36		for pb.Next() {
37			_ = Make(testData[i])
38			i++
39			if i >= len(testData) {
40				i = 0
41			}
42		}
43	})
44
45	b.StopTimer()
46
47	runtime.GC()
48	runtime.GC()
49}
50
51var (
52	testData      [128]string
53	testDataLarge [128 << 10]string
54)
55
56func init() {
57	for i := range testData {
58		testData[i] = fmt.Sprintf("%b", i)
59	}
60	for i := range testDataLarge {
61		testDataLarge[i] = fmt.Sprintf("%b", i)
62	}
63}
64