LoginSignup
2
2

More than 5 years have passed since last update.

【調査中】Goのbenchmarkを使うと環境ごとに結果がバラバラになってしまったので、誰か知恵を貸して欲しい

Last updated at Posted at 2017-12-08

今回のアドベントカレンダー、他のことを書く予定でいたのですが、不思議な事象に遭遇したのでこちらに的を絞って送ります。
解決してません。率直に言って謎。解決できたら追記します。むしろ誰か詳しい方がいたら教えてください。

今回試したこと

variableやconstを変数に代入するだけのコードを書き、ベンチマークをとりました。

ソースコード

package main

var a0 int64 = 0
var a1 int64 = 1
var b0 int8 = 0
var b1 int8 = 1
const c0 = 0
const c1 = 1
const n = 1048576

func case0() int8 {
    var number int8 = 0
    for i := 0; i < n; i++ {
        number = int8(a0)
        number = int8(a1)
    }
    return number
}

func case1() int8 {
    var number int8 = 0
    for i := 0; i < n; i++ {
        number = b0
        number = b1
    }
    return number
}

func case2() int8 {
    var number int8 = 0
    for i := 0; i < n; i++ {
        number = c0
        number = c1
    }
    return number
}

func case3() int8 {
    var number int8 = 0
    for i := 0; i < n; i++ {
        number = 0
        number = 1
    }
    return number
}

ベンチマークテスト

package main

import "testing"

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

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

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

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

結果

$ go test -bench . -benchmem
BenchmarkCase0-4        5000        314894 ns/op           0 B/op          0 allocs/op
BenchmarkCase1-4        5000        314963 ns/op           0 B/op          0 allocs/op
BenchmarkCase2-4        2000        636342 ns/op           0 B/op          0 allocs/op
BenchmarkCase3-4        5000        328588 ns/op           0 B/op          0 allocs/op

問題点

結果を見ればわかるように、constだけ2倍近く時間がかかります。constなので、他と同レベルの時間で処理が終わるはず。

補足

  • goのバージョンは1.8.3
  • OSはHigh Sierra 10.13.2
  • 自宅のデスクトップ(ubuntu16.04)で同じコードを動かすと定数が遅い事象は起きない
  • 他のmacで試したいが、アドベントカレンダーの締め切りまでに試せそうな端末がなかった

作業メモはこのページに集約して、こちらでは結果だけ書きます。

2
2
5

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
2
2