2

我们正在使用 Visual Studio 2005。我们正在考虑在 Visual Studio 2012 发布后升级到它。我在 Visual Studio 2012 RC 中尝试了这个小程序,并惊讶地发现它的运行速度比在 Visual Studio 2005 中慢 2 倍以上。在 VS2012 中,我使用了默认的发布构建设置。对我来说,VS2005 大约需要 20ms,VS2012 大约需要 50ms。为什么会慢很多?

#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;
}
4

3 回答 3

2

所以我们把这个问题转发到了微软论坛。 http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/72234b06-7622-445e-b359-88f572b4de52

简短的回答是,与 VS2005 相比,VS2012RC 中 std::deque::operator[] 的实现速度要慢一些。其他常见的 stl 容器测试为相同或更快。在 VS2012 生产时重新测试以查看 operator[] 性能是否得到解决将会很有趣。

ps

拉斐尔卡尔

于 2012-06-22T17:09:26.103 回答
1

我的怀疑是您遇到了线程安全代码,并且 2012 默认为多线程代码配置您的库,这意味着您的双端队列访问中内置了一堆锁定和解锁操作。

尝试比较两个版本的编译器和链接器选项,看看它们有何不同。

(我自己会尝试这个,但我没有带有相关软件的 Windows 系统。对不起。)

于 2012-06-21T19:16:34.783 回答
0

尝试分别计时这两个循环。我敢打赌,问题在于新编译器中的 stl 容器实现速度较慢。

错误等待-我的意思是尝试计时不使用 STL 的东西。

于 2012-06-21T19:09:13.567 回答