| package benchmarks |
| |
| import ( |
| "math/rand" |
| "runtime" |
| "strings" |
| "testing" |
| ) |
| |
| // This file demonstrates the overhead of calling runtime.Caller and runtime.FuncForPC |
| // On a 4 core 2017 Thinkpad, the following times were had: |
| // BenchmarkControl-4 10937064 102 ns/op |
| // BenchmarkRuntimeCaller_GetFile-4 2613914 439 ns/op |
| // BenchmarkRuntimeCaller_GetFunction-4 2198131 473 ns/op |
| |
| func BenchmarkControl(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| file := getRandomString() |
| if len(file) == 1000 { // prevent return value from being optimized away. |
| panic("should never happen") |
| } |
| } |
| } |
| |
| func BenchmarkRuntimeCaller_GetFile(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| _, file, _, ok := runtime.Caller(0) |
| if !ok || len(file) == 1000 { // prevent return value from being optimized away. |
| panic("should never happen") |
| } |
| } |
| } |
| |
| func BenchmarkRuntimeCaller_GetFunction(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| pc, _, _, ok := runtime.Caller(0) |
| f := runtime.FuncForPC(pc) |
| if !ok || len(f.Name()) == 1000 { // prevent return value from being optimized away. |
| panic("should never happen") |
| } |
| } |
| } |
| |
| func getRandomString() string { |
| n := rand.Intn(40) |
| return strings.Repeat("b", n) |
| } |