2

我們正在使用Visual Studio 2005.我們正在考慮在發佈Visual Studio 2012之後升級到Visual Studio 2012。我在Visual Studio 2012 RC中試過這個小程序,並且驚訝地發現它的運行速度比在Visual Studio 2005中慢了2倍以上。在VS2012中,我使用了默認的發佈版本設置。對我來說,VS2005大約需要20ms,VS2012大約需要50ms。爲什麼它慢得多?小型程序在Visual Studio 2012與Visual Studio 2005相比要慢得多

#include <windows.h> 
#include <deque> 

using namespace std; 

deque<int> d; 

int main(int argc, char* argv[]) 
{ 
    const int COUNT = 5000000; 

    timeBeginPeriod(1);  

    for (int i = 0; i < COUNT; ++i) 
    { 
     d.push_back(i); 
    } 

    double sum = 0; 

    DWORD start = timeGetTime(); 

    for (int i = 0; i < COUNT; ++i) 
    { 
     sum += d[i]; 
    } 

    printf("time=%dms\n", timeGetTime() - start); 

    printf("sum=%f\n", sum); 

    return 0; 
} 
+1

機會是你沒有編譯它們以同樣的方式。 –

+0

建議:如果使用或可能使用Visual C++標準庫,請勿使用'std :: deque'。它有[糟糕的性能特點。](http://stackoverflow.com/a/5607710/151292) –

+0

目標代碼:x86與x64? – Naszta

回答

0

嘗試分別計時這兩個循環。我敢打賭問題是,新編譯器中stl容器的實現比較慢。

錯誤等待 - 我的意思是嘗試計時一些不使用STL的東西。

+0

我非常懷疑它。 –

+0

這裏有兩個變量 - 編譯器的速度和STL的速度。我建議消除一個變量。是的 - 我打賭STL是可能的罪魁禍首。 –

1

我懷疑是你正在運行線程安全代碼,並且默認情況下2012會將你的庫配置爲多線程代碼,這意味着你的deque訪問中有一堆鎖和解鎖操作。

嘗試比較兩個版本的編譯器和鏈接器選項,看看它們有何不同。

(我想嘗試這個自己,但我沒有一個Windows系統,方便在其上的相關軟件。對不起。)

+0

請告訴我你在這裏純理論上,並且MS沒有將STL更改爲默認線程安全或其他。這似乎是...一個有趣的功能,應該真的被記錄在某個地方。 –

+0

爲什麼'std :: deque'需要內部同步? –

+0

這是純粹的猜測。但是,我依稀記得在版本之間發生了類似std :: string的情況。 –