small
parent
77b6191a91
commit
ae1d0f775b
|
@ -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`).
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue