| 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) | 
 | } |