STL裡list、vector、queue效能差異與疑似記憶體洩漏問題
阿新 • • 發佈:2019-01-07
最近在專案中debug退出後,VS的Output面板會輸出大量記憶體洩漏的資訊。經過排查,居然發現是使用了std::list的原因!
然而通過MSDN上一些前輩的討論,得知List並沒有真正導致記憶體洩漏,而是VS本身的 _CrtDumpMemoryLeaks()函式的執行位置的問題。
具體可以參考如下文章:
奇怪的是,如果把list換成vector或者queue,所有記憶體洩漏的問題都消失了。
list的push_back的實現會導致內部使用大量動態記憶體分配,而vector也會在動態增長連續記憶體長度的同時進行記憶體複製。
那麼在需要大量push_back的情況下究竟哪個效能會比較好?
於是我做了如下測試。我做的是一個圖形程式,程式執行的幀數可以很好的展示效能。
測試環境:
VS2008,Win7 64位,Intel i7處理器。
測試程式碼很簡單,在每一幀渲染程式碼中只填寫如下程式碼:
m_listTest.clear();
for (int i = 0; i < 100000; ++i)
{
int iTest;
m_listTest.push_back(iTest);
}
在debug模式下:
當m_listTest型別為list時,程式FPS只能達到5.
當m_listTest型別為vector時,程式FPS能達到20.
當m_listTest型別為queue時,程式FPS能達到20.
現在給程式碼加上迭代器的遍歷邏輯,看效率如何:
m_listTest.clear(); for (int i = 0; i < 100000; ++i) { int iTest; m_listTest.push_back(iTest); } for (list<int>::iterator it = m_listTest.begin(); it != m_listTest.end(); ++it) { int tets = *it; }
在debug模式下:
當m_listTest型別為list時,程式FPS只能達到4.
當m_listTest型別為vector時,程式FPS能達到10.
queue沒有迭代器,沒有測試。
可見list在加上遍歷邏輯後效能幾乎沒有受到影響,而vector效能降低到原來的一半。那麼如果vector採用隨機訪問的形式呢?程式碼如下:
m_listTest.clear();
for (int i = 0; i < 100000; ++i)
{
int iTest;
m_listTest.push_back(iTest);
}
for (int it = 0; it < m_listTest.size(); ++it)
{
int tets = m_listTest[it];
}
在debug模式下,當m_listTest型別為vector時,該程式碼能使程式FPS達到19.也就是說,相對於插入操作,下標遍歷的效能消耗幾乎可以無視。這樣的測試結果也很讓我意外。我一直以為如果資料要做頻繁的插入操作應該首選list。看起來queue是更好的選擇。
是時候拋棄list了嗎 ?...