Created
July 5, 2012 14:17
-
-
Save atombender/3053930 to your computer and use it in GitHub Desktop.
Array traversal benchmark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
}) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
== 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