I have been spending my day over implementing an efficient PubSub system. I 
had implemented one before using channels, and I wanted to benchmark that 
against sync.Cond. Here is the quick and dirty test that I put together 
https://gist.github.com/maxpert/f3c405c516ba2d4c8aa8b0695e0e054e. Now my 
confusion starts when I change GOMAXPROCS to test how it would perform on 
my age old Raspberry Pi. Here are results:

mxp@carbon:~/repos/raspchat/src/sibte.so/rascore$ GOMAXPROCS=8 go test -run 
none -bench Multiple -cpuprofile=cpu.out -memprofile=mem.out -benchmem
BenchmarkPubSubPrimitiveChannelsMultiple-8     10000    165419 ns/op     
 92 B/op       2 allocs/op
BenchmarkPubSubWaitGroupMultiple-8             10000    204685 ns/op     
 53 B/op       2 allocs/op
PASS
ok   sibte.so/rascore 3.749s
mxp@carbon:~/repos/raspchat/src/sibte.so/rascore$ GOMAXPROCS=4 go test -run 
none -bench Multiple -cpuprofile=cpu.out -memprofile=mem.out -benchmem
BenchmarkPubSubPrimitiveChannelsMultiple-4     20000    101704 ns/op     
 60 B/op       2 allocs/op
BenchmarkPubSubWaitGroupMultiple-4             10000    204039 ns/op     
 52 B/op       2 allocs/op
PASS
ok   sibte.so/rascore 5.087s
mxp@carbon:~/repos/raspchat/src/sibte.so/rascore$ GOMAXPROCS=2 go test -run 
none -bench Multiple -cpuprofile=cpu.out -memprofile=mem.out -benchmem
BenchmarkPubSubPrimitiveChannelsMultiple-2     30000     51255 ns/op     
 54 B/op       2 allocs/op
BenchmarkPubSubWaitGroupMultiple-2             20000     60871 ns/op     
 43 B/op       2 allocs/op
PASS
ok   sibte.so/rascore 4.022s
mxp@carbon:~/repos/raspchat/src/sibte.so/rascore$ GOMAXPROCS=1 go test -run 
none -bench Multiple -cpuprofile=cpu.out -memprofile=mem.out -benchmem
BenchmarkPubSubPrimitiveChannelsMultiple   20000     79534 ns/op      61 
B/op       2 allocs/op
BenchmarkPubSubWaitGroupMultiple          100000     19066 ns/op      40 
B/op       2 allocs/op
PASS
ok   sibte.so/rascore 4.502s

 I tried multiple times and results are consistent. I am using Go 1.8, 
Linux x64, 8GB RAM. I have multiple questions:


   - Why do channels perform worst than sync.Cond in single core results? 
   Context switching is same if anything it should perform worst.
   - As I increase the max procs the sync.Cond results go down which might 
   be explainable, but what is up with channels? 20k to 30k to 20k to  10k :( 
   I have a i5 with 4 cores, so it should have peaked at 4 procs (pst. I tried 
   3 as well it's consistent). 

 I am still suspicious I am not making some kind of mistake in code. Any 
ideas?

- Thanks

-- 
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