Recently, I published some benchmarks of Producer/Consumer in Akka. This post is a followup with more detail.
I have modified my test program (which is available on GitHub) to implement three different basic algorithms:
- Producer pushes to a bounded queue (i.e. producer blocks when the queue is full)
- Producer pushes to an unbounded queue, plus flow control to ensure that the queue doesn’t grow too large
- Consumer pulls
For each of these, I then benchmarked different variants as follows:
push_bal: Producer pushes to a bounded queue, with a BalancingDispatcher
push_rr: Producer pushes to a bounded queue, with a RoundRobinRouter
push_sm: Producer pushes to a bounded queue, with a SmallestMailboxRouter
flow_bal: Producer pushes to an unbounded queue, with a BalancingDispatcher
flow_rr: Producer pushes to an unbounded queue, with a RoundRobinRouter
flow_sm: Producer pushes to an unbounded queue, with a SmallestMailboxRouter
pull_1: Consumer pulls, with a batch size of 1
pull_10: Consumer pulls, with a batch size of 10
pull_20: Consumer pulls, with a batch size of 20
pull_50: Consumer pulls, with a batch size of 50
pull_cached: Consumer pulls, with an intermediate cache
Here is a spreadsheet of the results, including graphs, I get on my MacBook Pro (Core i7, 4 cores, 2 hyperthreads per core). Each test is run multiple times and the results averaged.
Updated results, incorporating suggestions from Viktor can be downloaded here.
Conclusions
Note: These conclusions are different from the initial version of this post, following suggestions from Viktor.
The headline is that the difference between the approaches is so small as to be almost irrelevant:
- For the push to a bounded queue version, BalancingDispatcher clearly outperforms both RoundRobinRouter and SmallestMailboxRouter, especially as the number of workers increases. Strangely the same difference is not present for the unbounded queue version.
- The pull approach can be made to perform virtually identically to the push model by batching queries.
0 Responses to “Benchmarking Producer/Consumer in Akka, Part 2”