| // Copyright 2024 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 testing_test |
| |
| import ( |
| "math/rand/v2" |
| "testing" |
| ) |
| |
| // ExBenchmark shows how to use b.Loop in a benchmark. |
| // |
| // (If this were a real benchmark, not an example, this would be named |
| // BenchmarkSomething.) |
| func ExBenchmark(b *testing.B) { |
| // Generate a large random slice to use as an input. |
| // Since this is done before the first call to b.Loop(), |
| // it doesn't count toward the benchmark time. |
| input := make([]int, 128<<10) |
| for i := range input { |
| input[i] = rand.Int() |
| } |
| |
| // Perform the benchmark. |
| for b.Loop() { |
| // Normally, the compiler would be allowed to optimize away the call |
| // to sum because it has no side effects and the result isn't used. |
| // However, inside a b.Loop loop, the compiler ensures function calls |
| // aren't optimized away. |
| sum(input) |
| } |
| |
| // Outside the loop, the timer is stopped, so we could perform |
| // cleanup if necessary without affecting the result. |
| } |
| |
| func sum(data []int) int { |
| total := 0 |
| for _, value := range data { |
| total += value |
| } |
| return total |
| } |
| |
| func ExampleB_Loop() { |
| testing.Benchmark(ExBenchmark) |
| } |