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

この文書のステータス

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

概要

よく左ビットシフト命令に最適化するのを見るが、どれくらいの速度の違いがあるのだろうか。

計測するコードを書く。

package main

import "testing"

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

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

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

// グローバル変数にしないと最適化される
var num = 4

//go:noinline
func mul(a int) int {
	return a * num
}

KDOC 305: 加算と左ビットシフトの実行速度を計測すると同様の方法で計測する。

$ go test -bench . -benchmem -count 100 > exec.log
$ benchstat exec.log
(略)
            │   exec.log   │
            │    sec/op    │
Shl-16        0.4839n ± 0%
Multiply-16   0.5117n ± 1%
geomean       0.4976n
(略)

ということで、0.03ナノ秒ほど左ビットシフト演算のほうが早い。だから左ビットシフトに最適化するわけだ。

関連