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.