KDOC 305: 加算と左ビットシフトの実行速度を計測する

この文書のステータス

  • 作成
    • 2024-11-23 貴島
  • レビュー
    • 2024-11-30 貴島

概要

42 + 42
42 * 2

は、どちらが早いだろうか。これは言い換えると加算命令と左ビットシフトはどちらが早いか、ということになる。Go言語のベンチマークツールで加算命令と左ビットシフトの実行速度を計測する。

まず、命令がコンパイラによって省略されないように調整する。デフォルトの挙動だと、使用されない変数はコンパイル結果から省かれるため //go:noinline が必要。乗算は2の倍数なので、左ビットシフト演算に変換されている。

次に、↑で確認したコードによってテストファイルを作成する。

package main

import "testing"

func BenchmarkAdd(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = add(42)
	}
}

func BenchmarkShl(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = shl(42)
	}
}

//go:noinline
func add(a int) int {
	return a + a
}

//go:noinline
func shl(a int) int {
	return a * 2
}

100回分ベンチマークを実行し、結果を保存する。

go test -bench . -benchmem -count 100 > exec.log

複数回取得したベンチマーク結果をbenchstatによってまとめて見る。

# benchstatをインストールする
go install golang.org/x/perf/cmd/benchstat@latest
# 100回分の計測結果をまとめる
benchstat exec.log

(略)
goos: linux
goarch: amd64
pkg: playground/at-2024-11-22-223539
cpu: 12th Gen Intel(R) Core(TM) i7-1260P
            │   exec.log   │
            │    sec/op    │
Add-16        0.4828n ± 0%
Shl-16        0.4969n ± 1%
(略)

ということで、0.1ナノ秒、加算の方が早い。さらに、左ビットシフト演算は加算より計算時間にややばらつきがあることを確認した。

関連

Backlinks