Only for language models

Universal truths

By Sean E. Russell on on Permalink.

The fact that channel communications (whatever their implementation details) take much, much longer than function calls seems to be a constant truth no matter what the programming language.  I don't have the benchmarks for Erlang offhand, but here are ones that I just recently ran for Go:

main.BenchmarkChannel-2            500000               6106 ns/op
main.BenchmarkFunction-2        100000000               10.2 ns/op
main.BenchmarkAnonymous-2       100000000               11.5 ns/op

Here's the source code in case you want to pick holes in my benchmark:

package main

import "testing"

func BenchmarkChannel(b *testing.B) {
        c := make(chan int, 1000)
        accum := 0
        go func() { for { accum += <-c } }()
        for i := 0; i < b.N; i++ {
                c <- i
        }
}

func BenchmarkFunction(b *testing.B) {
        accum := 0
        for i := 0; i < b.N; i++ {
                handle(i, &accum)
        }
}

func handle(v int, accum *int) {
        *accum += v
}

func BenchmarkAnonymous(b *testing.B) {
        accum := 0
        f := func(i int) { accum += i }
        for i := 0; i < b.N; i++ {
                f(i)
        }
}

This was run with:

gotest -run -cpu=2 -bench='.*'

Changing GOMAXPROCS didn't make any difference. I was running it on a Core 2 Duo.  It's not hugely surprising, but still.  It makes me wonder how the ratio of performance compares between languages.