Skip to content

Instantly share code, notes, and snippets.

@atombender
Created July 5, 2012 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atombender/3053930 to your computer and use it in GitHub Desktop.
Save atombender/3053930 to your computer and use it in GitHub Desktop.
Array traversal benchmark
package main
import (
"runtime"
"fmt"
"time"
)
const (
N = 300000000
)
func traverse(start int, stop int, values []int) int {
sum := 0
for i := start; i < stop; i++ {
sum += values[i]
}
return sum
}
func traverseWithChannel(start int, stop int, values []int, channel chan int) {
sum := 0
for i := start; i < stop; i++ {
sum += values[i]
}
channel <- sum
}
func benchOnce(label string, benchmarkable func() int) {
runtime.GC()
startTime := time.Now()
benchmarkable()
elapsedTime := time.Since(startTime)
fmt.Printf("%s took %v\n", label, elapsedTime)
}
func bench(label string, benchmarkable func() int) {
runtime.GC()
for i := 0; i < 8; i++ {
startTime := time.Now()
benchmarkable()
elapsedTime := time.Since(startTime)
fmt.Printf("%s took %v\n", label, elapsedTime)
}
}
func main() {
fmt.Printf("N=%d\n", N)
var ints []int
benchOnce("make array", func() int {
ints = make([]int, N)
for i := 0; i < N; i++ {
ints[i] = i
}
return 0
})
bench("traverse (normal for loop)", func() int {
var sum int = 0
var stop int = len(ints)
for i := 0; i < stop; i++ {
sum += ints[i]
}
return sum
})
bench("traverse (for with range)", func() int {
var sum int = 0
for i := range ints {
sum += ints[i]
}
return sum
})
bench("traverse (function)", func() int {
return traverse(0, len(ints), ints)
})
bench("traverse (4 goroutines)", func() int {
subs := 4
channel := make(chan int, subs)
for i := 0; i < subs; i++ {
go traverseWithChannel(
i * len(ints) / subs,
(i + 1) * len(ints) / subs,
ints,
channel)
}
sum := 0
for i := 0; i < subs; i++ {
sum += <- channel
}
return sum
})
}
== Go ==
go build arraytest.go && ./arraytest
N=300000000
make array took 928.527ms
traverse (normal for loop) took 417.687ms
traverse (normal for loop) took 406.406ms
traverse (normal for loop) took 406.45ms
traverse (normal for loop) took 406.454ms
traverse (normal for loop) took 406.843ms
traverse (normal for loop) took 406.555ms
traverse (normal for loop) took 406.821ms
traverse (normal for loop) took 406.301ms
traverse (for with range) took 406.733ms
traverse (for with range) took 406.257ms
traverse (for with range) took 406.891ms
traverse (for with range) took 406.564ms
traverse (for with range) took 406.507ms
traverse (for with range) took 406.536ms
traverse (for with range) took 406.507ms
traverse (for with range) took 406.768ms
traverse (function) took 396.152ms
traverse (function) took 396.647ms
traverse (function) took 396.709ms
traverse (function) took 396.602ms
traverse (function) took 396.728ms
traverse (function) took 396.409ms
traverse (function) took 396.061ms
traverse (function) took 396.688ms
traverse (4 goroutines) took 393.82ms
traverse (4 goroutines) took 394.498ms
traverse (4 goroutines) took 394.153ms
traverse (4 goroutines) took 394.423ms
traverse (4 goroutines) took 394.451ms
traverse (4 goroutines) took 394.239ms
traverse (4 goroutines) took 394.831ms
traverse (4 goroutines) took 394.599ms
== Go GCC ==
go build -compiler gccgo -gccgoflags "-static-libgcc -mtune=native -finline-functions -funroll-loops -pipe -O3" arraytest.go && ./arraytest
N=300000000
make array took 979.344ms
traverse (normal for loop) took 278.136ms
traverse (normal for loop) took 284.186ms
traverse (normal for loop) took 270.318ms
traverse (normal for loop) took 269.953ms
traverse (normal for loop) took 269.554ms
traverse (normal for loop) took 270.049ms
traverse (normal for loop) took 270.672ms
traverse (normal for loop) took 270.656ms
traverse (for with range) took 270.452ms
traverse (for with range) took 270.375ms
traverse (for with range) took 270.059ms
traverse (for with range) took 270.071ms
traverse (for with range) took 270.439ms
traverse (for with range) took 270.251ms
traverse (for with range) took 270.379ms
traverse (for with range) took 270.333ms
traverse (function) took 128.221ms
traverse (function) took 128.509ms
traverse (function) took 130.036ms
traverse (function) took 128.133ms
traverse (function) took 128.95ms
traverse (function) took 130.124ms
traverse (function) took 128.503ms
traverse (function) took 128.251ms
traverse (4 goroutines) took 427.103ms
traverse (4 goroutines) took 427.559ms
traverse (4 goroutines) took 429.933ms
traverse (4 goroutines) took 426.694ms
traverse (4 goroutines) took 426.601ms
traverse (4 goroutines) took 427.367ms
traverse (4 goroutines) took 427.035ms
traverse (4 goroutines) took 426.926ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment