Enhancement: strip off the std::map,use std::unordered_map instead
Thanks to Cppers on reddit here.
Currently the Looper use std::map<int, std::unique_ptr<Connection>> to keep track of which connection's lifecycle is under its monitoring.
/**
* This Looper acts as the executor on a single thread
* adopt the philosophy of 'one looper per thread'
* */
class Looper {
public:
...
private:
...
std::map<int, std::unique_ptr<Connection>> connections_;
...
};
However, since we don't required the ordered property provided by std::map, a better performance could be achieved by using std::unordered_map. Typically given the fact that currently any access to this connections_ variable requires mutex for synchronization.
I plan to implement this feature shortly.
Yukun Feb 07
Experimental profiling result:
On AWS m2.large with 8 vCPUs and 32GB Memory, 50GB root disk, running 10500 clients concurrently for 5 seconds, and taking average of 5 times:
With std::unordered_map, QPS = 58.9k.
With std::map, QPS = 59.0k.
With boost::unordered_map, QPS=59.1k.
This is a bit surprising, as it reveals that the performance bottlenect now is not the critical session of adding/removing Connection from the map data structure.