YukunJ / Turtle

A C++17-based lightweight high-performance network library

Home Page:https://github.com/YukunJ/Turtle

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Enhancement: strip off the std::map,use std::unordered_map instead

YukunJ opened this issue · comments

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.