KDOC 508: 除算の実行速度を計測する
この文書のステータス
- 作成
- 2026-01-08 貴島
- レビュー
- 2026-01-08 貴島
概要
除算というのは負荷の大きな演算であり、加算などの演算に比べると、実行に要する時間がはるかに長い(p51)。
アセンブリを見てみると、除算は命令数が多いのを確認できる。単純に DIV 命令だけではない。
じっさいに計測してみる。
go install golang.org/x/perf/cmd/benchstat@latest tmpdir=$(mktemp -d) cd $tmpdir cat > $tmpdir/bench_test.go <<EOF package main import "testing" func BenchmarkAdd(b *testing.B) { for i := 0; i < b.N; i++ { _ = add(42) } } func BenchmarkDiv(b *testing.B) { for i := 0; i < b.N; i++ { _ = div(42) } } //go:noinline func add(a int) int { return a + a } //go:noinline func div(a int) int { return a / a } EOF go mod init bench go mod tidy go test -bench=. -benchmem -count=10 > exec.log benchstat exec.log 2>&1 rm -rf $tmpdir
goos: linux
goarch: amd64
pkg: bench
cpu: AMD Ryzen 9 9900X 12-Core Processor
│ exec.log │
│ sec/op │
Add-24 0.9069n ± 1% 👈
Div-24 1.262n ± 4% 👈
geomean 1.070n
│ exec.log │
│ B/op │
Add-24 0.000 ± 0%
Div-24 0.000 ± 0%
geomean ¹
¹ summaries must be >0 to compute geomean
│ exec.log │
│ allocs/op │
Add-24 0.000 ± 0%
Div-24 0.000 ± 0%
geomean ¹
¹ summaries must be >0 to compute geomean
たしかに、除算は加算より時間がかかるのを確認できた。