testingパッケージのBenchmarkで性能計測

goのtestingパッケージには、ベンチマークを行うための機能も提供しています。

ここでは、簡単な例を通じてBenchmarkの取り方を確認します。

測定コード

main.go

例として、以下3つの関数を測定します。

package main

import (
	"fmt"
	"strconv"
)

func ItoaByFmt(n int) {
	var s []string
	for i := 0; i < n; i++ {
		s = append(s, fmt.Sprint(i))
	}
}

func ItoaByStrconv1(n int) {
	var s []string
	for i := 0; i < n; i++ {
		s = append(s, strconv.Itoa(i))
	}
}

func ItoaByStrconv2(n int) {
	s := make([]string, 0, n)
	for i := 0; i < n; i++ {
		s = append(s, strconv.Itoa(i))
	}
}

main_test.go

ベンチマークとして認識させたい場合、以下ルールに従って関数を実装します。

  • 関数の名前に Benchmarkプレフィックス をつける
  • 関数の引数に *testing.B を渡す
package main

import (
	"testing"
)

func BenchmarkItoaByFmt(b *testing.B)      { ItoaByFmt(b.N) }
func BenchmarkItoaByStrconv1(b *testing.B) { ItoaByStrconv1(b.N) }
func BenchmarkItoaByStrconv2(b *testing.B) { ItoaByStrconv2(b.N) }

実行

go test -bench .

811-go-benchmark_01.png

BenchmarkItoaByFmt-16 から以下情報が読み取れます。

  • CPU数 = 16
  • 実行回数 = 6450750回
  • 1回あたりの処理時間 = 163ns

go test -bench . -cpu 2

cpu数を変更できます。

811-go-benchmark_02.png

go test -bench . -count 3

ベンチマークを取る回数を変更できます。

811-go-benchmark_03.png

go test -bench . -benchtime 10s

ベンチマークの実行時間を変更できます。
(デフォルトは1秒です。)

811-go-benchmark_04.png

go test -bench . -benchmem

メモリ割り当て統計も出力できます。

811-go-benchmark_05.png

プロファイリングをWebで確認

前準備

graphvizが必要なのでインストールしておきます。

# macの場合
brew install graphviz

go test -bench . -cpuprofile cpu.out

CPUプロファイルを作成して、Webで確認します。

go test -bench . -cpuprofile cpu.out
go tool pprof -http=":8888" cpu.out
811-go-benchmark_10.png

http://localhost:8888/ にアクセスします。

811-go-benchmark_11.png

go test -bench . -memprofile mem.out

Memoryプロファイルを作成して、Webで確認します。

go test -bench . -memprofile mem.out
go tool pprof -http=":8888" mem.out
811-go-benchmark_20.png

http://localhost:8888/ にアクセスします。

811-go-benchmark_21.png

参考

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。

logo
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。