diff --git a/Development/go/testing.md b/Development/go/testing.md index e65eccf..d425bf1 100644 --- a/Development/go/testing.md +++ b/Development/go/testing.md @@ -2,4 +2,84 @@ ## Benchmark -To prevent +Any benchmark should be careful to prevent **compiler optimization**. + +Example `calc.go` in package `calc`: + +```go +package calc + +import ( + "time" +) + +var input float64 + +func init() { + if time.Now().Year() > 1900 { + input = 426942694269 + } +} + +func calc() int { + x := input + x /= 6.9 + x /= 4.2 + x /= 6.9 + x /= 4.2 + return int(x) +} +``` + +Example `calc_test.go` in package `calc`: + +```go +package calc + +import ( + "runtime" + "testing" +) + +func BenchmarkX(b *testing.B) { + for i := 0; i < b.N; i++ { + calc() + } +} + +var sink int + +func BenchmarkCalcSink(b *testing.B) { + var result int + for i := 0; i < b.N; i++ { + result = calc() + } + + // prevent compiler optimization + sink = result +} + +func BenchmarkCalcKeepAlive(b *testing.B) { + for i := 0; i < b.N; i++ { + result := calc() + + // prevent compiler optimization + runtime.KeepAlive(result) + } +} +``` + +Benchmark result when run with `go test -bench=.` + +```txt +goos: linux +goarch: amd64 +BenchmarkCalc-4 1000000000 0.343 ns/op +BenchmarkCalcSink-4 229652618 5.30 ns/op +BenchmarkCalcKeepAlive-4 225297381 5.27 ns/op +``` + +`BenchmarkCalc` is fast because it has compiler optimization. + +There are 2 methods for preventing compiler optimization: +sink (`BenchmarkCalcSink`) or keep alive (`BenchmarkCalcKeepAlive`). diff --git a/Extensions/vscode-extensions.md b/Extensions/vscode-extensions.md index 08083a4..4cb4579 100644 --- a/Extensions/vscode-extensions.md +++ b/Extensions/vscode-extensions.md @@ -11,5 +11,3 @@ [Bracket Pair Colorizer 2](https://github.com/CoenraadS/Bracket-Pair-Colorizer-2) [Prettier Formatter](https://github.com/prettier/prettier-vscode) - -[markdownlint](https://github.com/DavidAnson/vscode-markdownlint)