Awesome :) got similar results. So channels are slower for pubsub. I am surprised so far, with the efficiency going down as the cores go up (heck reminds me of that Node.js single core meme). Please tell me I am wrong here, is there any other more efficient approach?
On Sunday, July 16, 2017 at 8:06:44 PM UTC-7, peterGo wrote: > > Your latest benchmarks are invalid. > > In your benchmarks, replace b.StartTimer() with b.ResetTimer(). > > Simply run benchmarks. Don't run race detectors. Don't run profilers. For > example, > > $ go version > go version devel +504deee Sun Jul 16 03:57:11 2017 +0000 linux/amd64 > $ go test -run=! -bench=. -benchmem -cpu=1,2,4,8 pubsub_test.go > goos: linux > goarch: amd64 > BenchmarkPubSubPrimitiveChannelsMultiple 20000 86328 > ns/op 61 B/op 2 allocs/op > BenchmarkPubSubPrimitiveChannelsMultiple-2 30000 50844 > ns/op 54 B/op 2 allocs/op > BenchmarkPubSubPrimitiveChannelsMultiple-4 10000 112833 > ns/op 83 B/op 2 allocs/op > BenchmarkPubSubPrimitiveChannelsMultiple-8 10000 160011 > ns/op 88 B/op 2 allocs/op > BenchmarkPubSubWaitGroupMultiple 100000 21231 > ns/op 40 B/op 2 allocs/op > BenchmarkPubSubWaitGroupMultiple-2 10000 107165 > ns/op 46 B/op 2 allocs/op > BenchmarkPubSubWaitGroupMultiple-4 20000 73235 > ns/op 43 B/op 2 allocs/op > BenchmarkPubSubWaitGroupMultiple-8 20000 82917 > ns/op 42 B/op 2 allocs/op > PASS > ok command-line-arguments 15.481s > $ > > Peter > > On Sunday, July 16, 2017 at 9:51:38 PM UTC-4, Zohaib Sibte Hassan wrote: >> >> Thanks for pointing issues out I updated my code to get rid of race >> conditions (nothing critical I was always doing reader-writer race). Anyhow >> I updated my code on >> https://gist.github.com/maxpert/f3c405c516ba2d4c8aa8b0695e0e054e. Still >> doesn't explain the new results: >> >> $> go test -race -run=! -bench=. -benchmem -cpu=1,2,4,8 >> -cpuprofile=cpu.out -memprofile=mem.out pubsub_test.go >> BenchmarkPubSubPrimitiveChannelsMultiple 50 21121694 ns/op >> 8515 B/op 39 allocs/op >> BenchmarkPubSubPrimitiveChannelsMultiple-2 100 19302372 ns/op >> 4277 B/op 20 allocs/op >> BenchmarkPubSubPrimitiveChannelsMultiple-4 50 22674769 ns/op >> 8182 B/op 35 allocs/op >> BenchmarkPubSubPrimitiveChannelsMultiple-8 50 21201533 ns/op >> 8469 B/op 38 allocs/op >> BenchmarkPubSubWaitGroupMultiple 3000 501804 ns/op >> 63 B/op 2 allocs/op >> BenchmarkPubSubWaitGroupMultiple-2 200 15417944 ns/op >> 407 B/op 6 allocs/op >> BenchmarkPubSubWaitGroupMultiple-4 300 5010273 ns/op >> 231 B/op 4 allocs/op >> BenchmarkPubSubWaitGroupMultiple-8 200 5444634 ns/op >> 334 B/op 5 allocs/op >> PASS >> ok command-line-arguments 21.775s >> >> So far my testing shows channels are slower for pubsub scenario. I tried >> looking into pprof dumps of memory and CPU and it's not making sense to me. >> What am I missing here? >> >> On Sunday, July 16, 2017 at 10:27:04 AM UTC-7, peterGo wrote: >>> >>> When you have data races the results are undefined. >>> >>> $ go version >>> go version devel +dd81c37 Sat Jul 15 05:43:45 2017 +0000 linux/amd64 >>> $ go test -race -run=! -bench=. -benchmem -cpu=1,2,4,8 pubsub_test.go >>> ================== >>> WARNING: DATA RACE >>> Read at 0x00c4200140c0 by goroutine 18: >>> command-line-arguments.BenchmarkPubSubPrimitiveChannelsMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:59 +0x51d >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> >>> Previous write at 0x00c4200140c0 by goroutine 57: >>> [failed to restore the stack] >>> >>> Goroutine 18 (running) created at: >>> testing.(*B).run1() >>> /home/peter/go/src/testing/benchmark.go:207 +0x8c >>> testing.(*B).Run() >>> /home/peter/go/src/testing/benchmark.go:513 +0x482 >>> testing.runBenchmarks.func1() >>> /home/peter/go/src/testing/benchmark.go:417 +0xa7 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.runBenchmarks() >>> /home/peter/go/src/testing/benchmark.go:423 +0x86d >>> testing.(*M).Run() >>> /home/peter/go/src/testing/testing.go:928 +0x51e >>> main.main() >>> command-line-arguments/_test/_testmain.go:46 +0x1d3 >>> >>> Goroutine 57 (finished) created at: >>> command-line-arguments.BenchmarkPubSubPrimitiveChannelsMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:40 +0x290 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> ================== >>> --- FAIL: BenchmarkPubSubPrimitiveChannelsMultiple >>> benchmark.go:147: race detected during execution of benchmark >>> ================== >>> WARNING: DATA RACE >>> Read at 0x00c42000c030 by goroutine 1079: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple.func1() >>> /home/peter/gopath/src/nuts/pubsub_test.go:76 +0x9e >>> >>> Previous write at 0x00c42000c030 by goroutine 7: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:101 +0x475 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> >>> Goroutine 1079 (running) created at: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:93 +0x2e6 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> >>> Goroutine 7 (running) created at: >>> testing.(*B).run1() >>> /home/peter/go/src/testing/benchmark.go:207 +0x8c >>> testing.(*B).Run() >>> /home/peter/go/src/testing/benchmark.go:513 +0x482 >>> testing.runBenchmarks.func1() >>> /home/peter/go/src/testing/benchmark.go:417 +0xa7 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.runBenchmarks() >>> /home/peter/go/src/testing/benchmark.go:423 +0x86d >>> testing.(*M).Run() >>> /home/peter/go/src/testing/testing.go:928 +0x51e >>> main.main() >>> command-line-arguments/_test/_testmain.go:46 +0x1d3 >>> ================== >>> ================== >>> WARNING: DATA RACE >>> Write at 0x00c42000c030 by goroutine 7: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:101 +0x475 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> >>> Previous read at 0x00c42000c030 by goroutine 1078: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple.func1() >>> /home/peter/gopath/src/nuts/pubsub_test.go:76 +0x9e >>> >>> Goroutine 7 (running) created at: >>> testing.(*B).run1() >>> /home/peter/go/src/testing/benchmark.go:207 +0x8c >>> testing.(*B).Run() >>> /home/peter/go/src/testing/benchmark.go:513 +0x482 >>> testing.runBenchmarks.func1() >>> /home/peter/go/src/testing/benchmark.go:417 +0xa7 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.runBenchmarks() >>> /home/peter/go/src/testing/benchmark.go:423 +0x86d >>> testing.(*M).Run() >>> /home/peter/go/src/testing/testing.go:928 +0x51e >>> main.main() >>> command-line-arguments/_test/_testmain.go:46 +0x1d3 >>> >>> Goroutine 1078 (running) created at: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:93 +0x2e6 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> ================== >>> ================== >>> WARNING: DATA RACE >>> Read at 0x00c4200140c8 by goroutine 7: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:109 +0x51d >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> >>> Previous write at 0x00c4200140c8 by goroutine 175: >>> sync/atomic.AddInt64() >>> /home/peter/go/src/runtime/race_amd64.s:276 +0xb >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple.func1() >>> /home/peter/gopath/src/nuts/pubsub_test.go:88 +0x19a >>> >>> Goroutine 7 (running) created at: >>> testing.(*B).run1() >>> /home/peter/go/src/testing/benchmark.go:207 +0x8c >>> testing.(*B).Run() >>> /home/peter/go/src/testing/benchmark.go:513 +0x482 >>> testing.runBenchmarks.func1() >>> /home/peter/go/src/testing/benchmark.go:417 +0xa7 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.runBenchmarks() >>> /home/peter/go/src/testing/benchmark.go:423 +0x86d >>> testing.(*M).Run() >>> /home/peter/go/src/testing/testing.go:928 +0x51e >>> main.main() >>> command-line-arguments/_test/_testmain.go:46 +0x1d3 >>> >>> Goroutine 175 (finished) created at: >>> command-line-arguments.BenchmarkPubSubWaitGroupMultiple() >>> /home/peter/gopath/src/nuts/pubsub_test.go:93 +0x2e6 >>> testing.(*B).runN() >>> /home/peter/go/src/testing/benchmark.go:141 +0x12a >>> testing.(*B).run1.func1() >>> /home/peter/go/src/testing/benchmark.go:214 +0x6b >>> ================== >>> --- FAIL: BenchmarkPubSubWaitGroupMultiple >>> benchmark.go:147: race detected during execution of benchmark >>> FAIL >>> exit status 1 >>> FAIL command-line-arguments 0.726s >>> $ >>> >>> Peter >>> >>> On Sunday, July 16, 2017 at 10:20:21 AM UTC-4, Zohaib Sibte Hassan wrote: >>>> >>>> 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.