LoginSignup
0
2

More than 5 years have passed since last update.

Go 言語で同一ファイル中のベンチマーク同士を比較するツールを作った

Posted at

はじめに

  • Go 言語のベンチマーク結果を比較するツールとしてbenchcmpがあります
  • 使い方としては比較したいベンチマーク結果をファイルに書き出しておいてbenchcmp <Before file> <After file>のように実行します
  • 使われ方としてベンチマーク取って改善してどれだけ速くなったかを比較したいとかを想定しているのだと思いますが、同一のテストファイル中のベンチマーク同士を比較するのが面倒なのでbbcmpというツールを作ってみました。

bbcmpでできること

  • 同一ファイル中のベンチマーク同士の比較
  • サブベンチマークを使えば一度に複数のベンチマークの比較ができます
  • 標準入力とファイルから読み込みができます

Install

go get golang.org/x/tools/benchmark/parse
go get github.com/nirasan/bbcmp
go install github.com/nirasan/bbcmp

How to use

Read from stdin

go test -run=NONE -bench . | bbcmp <BEFORE_BENCH_REGEX> <AFTER_BENCH_REGEX>

Read from file

go test -run=NONE -bench . > result.txt
bbcmp -f result.txt <BEFORE_BENCH_REGEX> <AFTER_BENCH_REGEX>

Example

Compare normal benchmarks

sample1_test.go

package sample

import (
    "testing"
)

func BenchmarkSample1Double1(b *testing.B) {
    f := func(n int) int { return n * 2}
    for i := 0; i < b.N; i++  {
        f(i)
    }
}

func BenchmarkSample1Double2(b *testing.B) {
    f := func(n int) int { return n << 1}
    for i := 0; i < b.N; i++  {
        f(i)
    }
}

sample1.txt

BenchmarkSample1Double1-4       1000000000           2.29 ns/op
BenchmarkSample1Double2-4       1000000000           2.26 ns/op
PASS
ok      github.com/nirasan/bbcmp/sample 5.016s

Run

> bbcmp -f sample1.txt Double1 Double2
benchmark                     old ns/op     new ns/op     delta
BenchmarkSample1Double1-4     2.29          2.26          -1.31%

Compare sub benchmarks

sample2_test.go

package sample

import "testing"

func BenchmarkSample2DoubleBefore(b *testing.B) {
    b.Run("Double1", func(b *testing.B){
        f := func(n int) int { return n * 2 }
        for i := 0; i < b.N; i++ {
            f(i)
        }
    })
    b.Run("Double2", func(b *testing.B){
        f := func(n int) int { return n << 1 }
        for i := 0; i < b.N; i++ {
            f(i)
        }
    })
}

func BenchmarkSample2DoubleAfter(b *testing.B) {
    b.Run("Double1", func(b *testing.B){
        f := func(n int) int { return 2 * n }
        for i := 0; i < b.N; i++ {
            f(i)
        }
    })
    b.Run("Double2", func(b *testing.B){
        f := func(n int) int { return n + n }
        for i := 0; i < b.N; i++ {
            f(i)
        }
    })
}

sample2.txt

BenchmarkSample2DoubleBefore/Double1-4          1000000000           2.28 ns/op
BenchmarkSample2DoubleBefore/Double2-4          1000000000           2.26 ns/op
BenchmarkSample2DoubleAfter/Double1-4           1000000000           2.29 ns/op
BenchmarkSample2DoubleAfter/Double2-4           1000000000           2.26 ns/op
PASS
ok      github.com/nirasan/bbcmp/sample 10.040s

Run

> bbcmp -f sample2.txt Before After
benchmark                                  old ns/op     new ns/op     delta
BenchmarkSample2DoubleBefore/Double1-4     2.28          2.29          +0.44%
BenchmarkSample2DoubleBefore/Double2-4     2.26          2.26          +0.00%
0
2
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
2