去年刚进公司的时候,公司基础库里面有个LRUCache,里面的实现用的是std::list。但是里面计算std::list的函数直接使用的是stl里面的size()方法。结果压测的时候,性能卡在这里了。
今天,有个同事又在基础库里面发现一个队列的实现,也用到了std::list,取元素的个数的时候同样用到了size()方法。
很遗憾的是,公司的基础库只暴露了头文件,无法一一去检查这个坑是否会在其他地方还会有。
下面看一下stl里面size()方法的实现:
size_type size() const { return std::distance(begin(), end()); }
上面的代码g++版本是4.2.1
显然,复杂度为O(N)。当list里面元素比较多的时候,计算将很慢。 所以,当使用std::list的时候,一定记得自己维护一个count。