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

たしかに、除算は加算より時間がかかるのを確認できた。

関連

Backlinks