Go言語のベンチマークテストの基本と活用例
生徒
「Go言語で書いたプログラムの処理速度を確認したいのですが、どうすれば良いですか?」
先生
「Goにはベンチマークテストを行う機能があります。BenchmarkXxxという関数名で書くと、処理時間を測定できます。」
生徒
「テストとベンチマークはどう違うのですか?」
先生
「テストは処理が正しく動作するかを確認するもの、ベンチマークは処理速度や性能を確認するものです。どちらもtestingパッケージを使います。」
1. ベンチマークテストとは?
ベンチマークテストは、関数や処理がどれくらいの時間で実行されるかを測定するためのテストです。GoではBenchmarkXxxという関数名で定義し、b *testing.Bを引数に取ります。b.N回処理を繰り返すことで平均的な処理時間を計測できます。
2. 基本的な書き方
例えば、整数を二倍にする関数をベンチマークする場合の書き方です。関数の正しい動作よりも処理時間の測定が目的です。
package main
import "testing"
func Double(n int) int {
return n * 2
}
func BenchmarkDouble(b *testing.B) {
for i := 0; i < b.N; i++ {
Double(100)
}
}
このBenchmarkDouble関数を実行すると、b.N回繰り返して平均処理時間が計測されます。
3. ベンチマーク実行の方法
ターミナルで以下のコマンドを実行します。-bench=.はすべてのベンチマークを実行するオプションです。
go test -bench=.
実行結果には、処理回数や平均実行時間が表示されます。これにより、どの関数がどれくらい時間を消費しているかを簡単に確認できます。
4. 応用例:スライスの処理速度比較
複数の処理方法の速度を比較する場合、サブベンチマークを使うと便利です。次の例は、スライスの合計を求める方法を二通り比較しています。
func SumSliceLoop(slice []int) int {
sum := 0
for _, v := range slice {
sum += v
}
return sum
}
func SumSliceRange(slice []int) int {
sum := 0
for i := 0; i < len(slice); i++ {
sum += slice[i]
}
return sum
}
func BenchmarkSumSlice(b *testing.B) {
slice := make([]int, 1000)
for i := 0; i < 1000; i++ {
slice[i] = i
}
b.Run("RangeLoop", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SumSliceRange(slice)
}
})
b.Run("ForEachLoop", func(b *testing.B) {
for i := 0; i < b.N; i++ {
SumSliceLoop(slice)
}
})
}
このようにサブベンチマークを使うと、どの方法がより高速かを一目で比較できます。処理速度を測定することで、パフォーマンス改善の指針になります。
5. 初心者向けのポイント
ベンチマークテストでは、まずb.N回の繰り返しとb.Runを理解することが大切です。関数の正確な動作よりも、処理速度の比較やパフォーマンス改善が目的です。小さな処理でも測定を重ねることで、効率の良いコードを書くためのヒントが得られます。Go言語でベンチマークテストを活用することで、プログラムの速度を確認し、最適化するための技術が身につきます。