I write a benchmark, but the results of the following 3 cases are much 
different.
Which one is reliable?

package main

import (
    "testing"
    "runtime"
)

const N = 200 * 1000
type Element int64
var sum int

func Benchmark_MaybeOptimizedOut(b *testing.B) {
    var a [N]Element
    b.ResetTimer()
    var g int
    for i := 0; i < b.N; i++ {
        for j := 0; j < len(a); j++ {
            g += int(a[j])
        }
    }
}

func Benchmark_AssignToGlobal(b *testing.B) {
    var a [N]Element
    b.ResetTimer()
    var g int
    for i := 0; i < b.N; i++ {
        for j := 0; j < len(a); j++ {
            g += int(a[j])
        }
    }
    sum = g
}

func Benchmark_KeepAlive(b *testing.B) {
    var a [N]Element
    b.ResetTimer()
    var g int
    for i := 0; i < b.N; i++ {
        for j := 0; j < len(a); j++ {
            g += int(a[j])
        }
    }
    runtime.KeepAlive(&g)
}

/* output:
$ go test -bench=. -benchtime=3s
Benchmark_MaybeOptimizedOut-4          50000         87318 ns/op
Benchmark_AssignToGlobal-4             20000        205934 ns/op
Benchmark_KeepAlive-4                  10000        620351 ns/op
*/

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to