LoginSignup
0
0

More than 1 year has passed since last update.

Goでベンチマークテスト

Posted at

概要

この記事は、CyberAgent PTA Advent Calendar 2022の12日目の記事です。
広告プロダクトチームでサーバーサイドエンジニアをやっています。
Golangの広告プロダクト実装において、システムパフォーマンスも意識しながら実装をしていたため、今回はGoにベンチマークテストについて書きます。

Go Benchmark

Goのtestingパッケージには、ベンチマークを行う機能が提供されています。

func BenchmarkXxx(*testing.B)

のように、関数の接頭辞にBenchmarkを付けることで、ベンチマークテスト用の関数として見なされます。
go test-benchフラグを付けることで実行可能です。

ベンチマーク用関数のサンプルは下記で、

func BenchmarkRandInt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        rand.Int()
    }
}

b.N回実行されるようになっていて、
下記のような実行結果が出力されます。

BenchmarkRandInt-8   	68453040	        17.8 ns/op

ループあたり17.8nsの速度で、68453040回実行されたことを意味しています。

オプション

いくつかのオプションが用意されていて、より詳細な情報を出力することもできます。
-benchmemはメモリの情報を出力できるので、おすすめ。
-cpu, -benchtime, -cpuprofileなどいくつかあります。
詳細はこちら: https://pkg.go.dev/cmd/go#hdr-Testing_flags

ベンチマークテストしてみる

import (
	"fmt"
	"strconv"
	"testing"
)

func BenchmarkA(b *testing.B) {
	for i := 0; i < b.N; i++ {
		testA(i)
	}
}

func BenchmarkB(b *testing.B) {
	for i := 0; i < b.N; i++ {
		testB(i)
	}
}

func testA(num int) string {
	return strconv.Itoa(num)
}

func testB(num int) string {
	return fmt.Sprintf("%d", num)
}

strconv.Itoafmt.Sprintfを比較するテストを書いてみました。

go test -bench . -benchmemで実行します。

BenchmarkA-8    47877226                24.79 ns/op            7 B/op          0 allocs/op
BenchmarkB-8    15777586                76.22 ns/op           16 B/op          1 allocs/op

strconv.Itoaは、ループ当たり24.79nsの速度で、47877226回実行でき、
fmt.Sprintfは、ループ当たり76.22nsの速度で、15777586回実行できたことが分かりました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0