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
たしかに、除算は加算より時間がかかるのを確認できた。
関連
抽象。
- 同じ基本演算に見えても、種類によってかかる時間が大きく違う
関連。
- 参照: KDOC 217: 『基礎からきっちり覚える 機械語入門』から
- 類似: KDOC 307: 乗算と左ビットシフトの実行速度を計測する。演算の種類によって速さが違うのを、ベンチマークで確かめる例