On Tuesday, 24 March 2020 20:26:10 UTC, Sean Liao wrote: > > see https://github.com/golang/go/issues/27217 >
Thanks, will do. > > > On Tuesday, March 24, 2020 at 5:24:08 PM UTC+1, Orson Cart wrote: >> >> I posted this earlier but I realised that the code had a fundamental >> error in it. I've corrected here it but the underlying problem still exists. >> >> I've recently started using go test's benchmarks support and I'm >> particularly interested in understanding the benchmark timer functions. >> I've been getting results that I found surprising and I was wondering if >> anyone could explain what's going on here. >> >> The code below has three benchmarks that each invoke a single function >> (foo). The implementation of foo isn't important, it's just there to >> consume some time: >> - foo is called once per iteration in Benchmark1. >> - It's called twice per iteration in Benchmark2 so I'd expect >> Benchmark2's duration to be nominally twice that of Benchmark1. >> - It's also called twice per iteration in Benchmark3 but the first call >> is wrapped in b.StopTimer and b.startTimer calls. Because of this I'd have >> expected Benchmark3 to be about the same duration as Benchmark1 >> >> Apologies for the length of the example but I didn't think it fair to ask >> the question and leave anything out. >> >> package demo_test >> >> import ( >> "strconv" >> "testing" >> ) >> >> var Foo1 []string >> var Foo2 []string >> var Count int = 32767 >> >> func Benchmark1(b *testing.B) { >> for i := 0; i < b.N; i++{ >> Foo1 = foo(Count) >> } >> } >> >> func Benchmark2(b *testing.B) { >> for i := 0; i < b.N; i++{ >> Foo1 = foo(Count) >> Foo2 = foo(Count) >> } >> } >> >> func Benchmark3(b *testing.B) { >> for i := 0; i < b.N; i++{ >> b.StopTimer() >> Foo1 = foo(Count) >> b.StartTimer() >> Foo2 = foo(Count) >> } >> } >> >> func foo(count int) []string{ >> testData := []string{} >> for i:= 0; i < count; i++ { >> testData = append(testData, strconv.Itoa(i)) >> } >> >> return testData >> } >> >> >> When the benchmarks are run the results are as follows: >> >> Benchmark1-4 351 3345215 ns/op >> Benchmark2-4 166 7206582 ns/op >> Benchmark3-4 334 3457907 ns/op >> PASS >> ok bar.com/benchmarks 6.881s >> >> OK benchmark3 is a little slower than Benchmark1 but that's not what's >> bothering me. It's this: if I now change Count to something much smaller >> the results are a surprise, at least to me. Here are the results when Count >> = 8: >> >> Benchmark1-4 2706196 442 ns/op >> Benchmark2-4 1357482 873 ns/op >> Benchmark3-4 840729 1387 ns/op >> PASS >> ok bar.com/benchmarks 23.547s >> >> The ratio of timings for Benchmark1 and Benchmark2 are roughly in line >> with expectations but I was surprised to see that the timings for >> Benchmark3 are now larger than those for Benchmark2. >> >> Can anyone explain this? >> >> TIA >> Orson >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/5fbe51aa-0ae6-4982-b48c-215af1653f45%40googlegroups.com.