2013-05-28 111 views
-1

我有以下代碼快:爲什麼列表迭代比矢量迭代C++

main() { 
    vector<int> v (1000,0); 
    list<int> l (1000,0); 

    clock_t begin,end; 

    cout <<"Vector size: "<<v.size()<<endl; 
    cout <<"List size: "<<l.size()<<endl; 

    begin=clock(); 
    for (int i=0;i<1000000;i++) 
    for (vector <int>::iterator it=v.begin();it!=v.end();it++); 
    end=clock(); 

    cout <<v[0]<<endl; 
    cout << "Vector iteration: " << (double)(end-begin)/CLOCKS_PER_SEC <<endl; 


    begin=clock(); 
    for (int i=0;i<1000000;i++) 
    for (list <int>::iterator it=l.begin();it!=l.end();it++); 
    end=clock(); 

    list <int>::iterator it=l.begin(); 
    cout << *it <<endl; 
    cout << "List iteration: " << (double)(end-begin)/CLOCKS_PER_SEC <<endl; 
} 

不變的是,我得到的結果是向量迭代(約)18.3秒和列表迭代 (約)11.7秒。這怎麼可能?我的測量有問題嗎?

感謝您的幫助!

+2

我在O3上得到'vector'爲0,'list'爲1.707。 – chris

+0

我得到的結果與傑瑞基本相同。在啓用調試模式的情況下,我得到列表比這個向量稍慢(但我必須將週期數減少到1000,以在合理的時間內完成它。) – ChaosCakeCoder

+1

這是免費的-1,用於在沒有優化的情況下進行基準測試。 –

回答

6

根據您列出的時間量(每個10-20秒),似乎幾乎可以肯定您正在編譯禁用優化。這使你的結果基本上毫無意義。

對我的(大約7歲)機器進行快速測試,並啓用了優化功能我得到的時間爲0,矢量爲1.2-1.5秒(1.2與VC++,1.5與g ++)。

隨着優化禁用,他們都放慢(很多)。用VC++,我看到矢量約38秒,列表43秒。使用g ++,這些對於向量來說更像是36秒,列表則是29秒。後者(大致)匹配你所看到的(以我的顯然較老/較慢的計算機爲模),所以我猜想你正在使用禁用優化的g ++。底線:你看到的可能幾乎完全是代碼碰巧被寫入的僞像(例如,可能是代碼中的一個額外的函數調用)。這與矢量或列表本身的固有效率完全無關。


  1. 只是爲了完整性:我想你可以簡單地通過一個真的老了,速度慢,計算機上運行的代碼至少拿到結果的地方接近該範圍。由於我們的談話速度比現在的計算機慢大約20倍,因此可以推測出Pentium可能會達到150到233(左右)MHz,可以想象得出這個總體順序的結果。有了這樣一箇舊的CPU,當前代碼優化中的很多假設可能並不適用,所以我認爲幾乎沒有可能發生的事情可能會引起反彈,導致列表速度加快。即使那樣,我也不會期待它,但是編譯器期望的CPU和運行它的CPU之間的這種不匹配,幾乎任何事情都是可能的。