Go言語にはテスト環境も整備されていますが、ここではベンチマークの例です。testingモジュールのベンチマーク機能を使うことで、わざわざソースコードに性能測定のためのコードの埋め込みが不要になります。ここでは素数計算のコードをターゲットとしてみました。
package adder
import (
"fmt"
"runtime"
"time"
)
func oddCalc() {
runtime.GOMAXPROCS(8)
c := 2
odd := []int{}
tStart := time.Now()
for i := 2; i <= 10000*1000; i++ {
func() {
flag := true // if odd number, stay "true"
for j := 2; j*j <= c; j++ {
if c%j == 0 {
flag = false
break
}
}
if flag {
odd = append(odd, c)
}
c++
}()
}
tStop := time.Now()
fmt.Println(len(odd))
el := tStop.Sub(tStart)
fmt.Println(el)
}
同じディレクトリにベンチマーク用の以下のソースコードファイルを用意しておきます。ターゲットと同じファイル中でも構わないと思いますが、ベンチマークを簡単に実行の趣旨からすると外れてます。
package adder
import (
"testing"
)
func BenchmarkOddCalc(b *testing.B) {
oddCalc()
}
実行結果は以下のとおりです。終了コードの判定もエラーコードも返していないのでpass~~が出力されています。
% go test -bench=. -v
goos: darwin
goarch: arm64
pkg: test
BenchmarkOddCal
664579
1.241648416s
BenchmarkOddCal-8 1 1241672042 ns/op
PASS
ok test 1.485s
ソースコードに埋め込んだ時間測定とは微妙に値が異なりますが、精度から見れば誤差範囲です。
と言うわけでGoではわざわざ性能測定のためにターゲットのコード中にコードの埋め込みは要らないよという話でした。
admin