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的情况。 –