去年剛進公司的時候,公司基礎庫裡面有個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。