1. 程式人生 > >STL裡list、vector、queue效能差異與疑似記憶體洩漏問題

STL裡list、vector、queue效能差異與疑似記憶體洩漏問題

最近在專案中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了嗎 ?...