1) std::list::size() 是O(n)的
我会连接后端某个服务, 后端服务挂掉后, 我会堆积请求; 重连上之后会发送,使用std::list::size来进行不为空的判断或者log输出。
结果cpu 占了100%, 1秒发不了几个包。
最后通过log定位到了std::list::size()可能有问题, 阅读源码,确定是这个原因。
后来网上也看到类似的:http://blog.youkuaiyun.com/russell_tao/article/details/8572000
另外,合作部门的同事说:
1) c++11的std::list::size是O(1) ? 我看源码不是这样哦? 仍然是O(n)
2) 使用deque做FIFO队列。 侯捷的stl源码剖析中说deque有性能问题,实现很复杂, FIFO使用deque也是非常浪费。
2) __gnu_cxx::hashmap::begin() 不是O(1)
begin成员函数是顺序扫描hashmap的bucket, 找到第一个非空的bucket。
当hashmap的bucket比较大(100w级别), 同时元素较少时, 同样非常吃cpu、且慢。
具体见 http://blog.youkuaiyun.com/aalbertini/article/details/38843673