So you have 4 threads that are all waiting on a single thread to feed them.
Since the actual work these threads are doing is nothing, progress
depends on the single thread feeding them.
- jessta
--
=====================
http://jessta.id.au
$ ./6.out
1: 2000000 960 ns/op
2: 500000 7147 ns/op
$
i thought it was interesting that even with GOMAXPROCS > 1, multiple
readers caused a slowdown compared to one reader. i guess it's
possible that's due to lock contention.
here's another micro-benchmark that tries out combinations
of buffer size, GOMAXPROCS and reader count.
here are some results, sorted by time-per-channel-send.
while it's clear that GOMAXPROCS=1 has least channel
overhead, other tradeoffs are not so clear. the 50x difference
is quite interesting.
procs 1; readers 1; buffer 100; 10000000 186 ns/op
procs 1; readers 2; buffer 100; 10000000 188 ns/op
procs 1; readers 3; buffer 100; 10000000 194 ns/op
procs 1; readers 4; buffer 100; 10000000 196 ns/op
procs 1; readers 1; buffer 10; 10000000 237 ns/op
procs 1; readers 2; buffer 10; 10000000 269 ns/op
procs 1; readers 3; buffer 10; 10000000 294 ns/op
procs 1; readers 4; buffer 10; 5000000 321 ns/op
procs 1; readers 1; buffer 0; 5000000 462 ns/op
procs 1; readers 3; buffer 0; 5000000 468 ns/op
procs 1; readers 2; buffer 0; 5000000 470 ns/op
procs 1; readers 4; buffer 0; 5000000 496 ns/op
procs 1; readers 1; buffer 1; 5000000 751 ns/op
procs 1; readers 2; buffer 1; 2000000 762 ns/op
procs 1; readers 3; buffer 1; 2000000 777 ns/op
procs 1; readers 4; buffer 1; 2000000 786 ns/op
procs 3; readers 1; buffer 10; 2000000 1234 ns/op
procs 2; readers 1; buffer 10; 1000000 1250 ns/op
procs 4; readers 1; buffer 10; 1000000 1406 ns/op
procs 2; readers 2; buffer 0; 1000000 1577 ns/op
procs 2; readers 3; buffer 0; 1000000 1919 ns/op
procs 2; readers 2; buffer 100; 1000000 1960 ns/op
procs 2; readers 4; buffer 10; 1000000 2001 ns/op
procs 2; readers 3; buffer 100; 2000000 2077 ns/op
procs 2; readers 3; buffer 10; 1000000 2357 ns/op
procs 4; readers 1; buffer 100; 500000 2423 ns/op
procs 2; readers 4; buffer 0; 500000 2441 ns/op
procs 2; readers 4; buffer 100; 500000 2601 ns/op
procs 2; readers 2; buffer 10; 500000 2611 ns/op
procs 2; readers 1; buffer 100; 500000 2872 ns/op
procs 3; readers 1; buffer 100; 500000 3036 ns/op
procs 4; readers 1; buffer 0; 500000 3860 ns/op
procs 2; readers 1; buffer 0; 500000 3879 ns/op
procs 3; readers 2; buffer 0; 500000 3912 ns/op
procs 4; readers 2; buffer 0; 500000 3925 ns/op
procs 3; readers 1; buffer 0; 500000 3963 ns/op
procs 4; readers 3; buffer 0; 500000 5132 ns/op
procs 3; readers 4; buffer 10; 200000 5564 ns/op
procs 4; readers 4; buffer 10; 200000 5785 ns/op
procs 4; readers 4; buffer 100; 200000 5972 ns/op
procs 4; readers 2; buffer 10; 500000 6240 ns/op
procs 2; readers 4; buffer 1; 500000 6358 ns/op
procs 3; readers 3; buffer 10; 200000 6513 ns/op
procs 2; readers 3; buffer 1; 500000 6594 ns/op
procs 4; readers 4; buffer 0; 200000 6718 ns/op
procs 4; readers 3; buffer 10; 200000 6721 ns/op
procs 2; readers 2; buffer 1; 500000 6809 ns/op
procs 3; readers 2; buffer 100; 200000 7044 ns/op
procs 3; readers 3; buffer 100; 500000 7152 ns/op
procs 3; readers 4; buffer 100; 200000 7233 ns/op
procs 4; readers 2; buffer 100; 200000 7288 ns/op
procs 4; readers 1; buffer 1; 500000 7378 ns/op
procs 2; readers 1; buffer 1; 500000 7423 ns/op
procs 3; readers 1; buffer 1; 500000 7442 ns/op
procs 3; readers 2; buffer 10; 500000 7467 ns/op
procs 3; readers 2; buffer 1; 500000 7508 ns/op
procs 3; readers 4; buffer 0; 200000 7574 ns/op
procs 4; readers 2; buffer 1; 500000 7738 ns/op
procs 3; readers 3; buffer 1; 200000 8004 ns/op
procs 3; readers 3; buffer 0; 200000 8298 ns/op
procs 4; readers 4; buffer 1; 500000 8320 ns/op
procs 4; readers 3; buffer 1; 500000 8336 ns/op
procs 4; readers 3; buffer 100; 200000 8483 ns/op
procs 3; readers 4; buffer 1; 200000 9590 ns/op