Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多

Posted

技术标签:

【中文标题】Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多【英文标题】:small program much slower in visual studio 2012 vs. visual studio 2005 【发布时间】:2012-06-21 19:02:35 【问题描述】:

我们正在使用 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;

【问题讨论】:

你可能没有以同样的方式编译它们。 建议:如果您使用或可能使用 Visual C++ 标准库,请不要使用std::deque。它有abysmal performance characteristics. 尝试检查超出范围的错误,看看 VS 2012 是否显示断言。他们启用了一些检查,您可能在 2005 年禁用它并在 2012 年启用它msdn.microsoft.com/en-us/library/aa985982%28v=vs.80%29.aspx 两者都是 x86,两种优化设置似乎都一样(2012 年的项目是从 2005 年的项目转换而来的)。很快会尝试其他建议。 2005 年还好:无论我对“启用 C++ 异常”使用什么设置,它的运行时间都是一样的,大约 20 毫秒。对于 2012 年,如果我禁用异常,它会从大约 50 毫秒到 23 毫秒左右。那么在这种情况下,2005 处理有更好的异常?那仍然会令人失望,我们通常会在异常情况下运行。 【参考方案1】:

因此,我们将这个问题重新发布到了 Microsoft 论坛。 http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/72234b06-7622-445e-b359-88f572b4de52

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

ps 嗨拉斐尔 卡尔

【讨论】:

【参考方案2】:

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

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

(我会自己尝试,但我手头没有安装相关软件的 Windows 系统。抱歉。)

【讨论】:

请告诉我你在这里是纯理论的,MS 没有将 STL 更改为默认线程安全或其他什么。这似乎是...一个有趣的功能,应该真正真的在某处记录。 为什么std::deque 需要内部同步? 这纯属猜测。但是,我隐约记得 std::string 版本之间发生了类似的事情。【参考方案3】:

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

Err wait - 我的意思是尝试对不使用 STL 的东西进行计时。

【讨论】:

这里有两个变量——编译器的速度和STL的速度。我建议消除一个变量。是的 - 我打赌 STL 可能是罪魁祸首。

以上是关于Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio进行Web性能测试- Part I

使用Microsoft Visual Studio 2019进行unity开发代码无智能提示

Visual Studio 2012 与 Visual Studio 2010 (delta) [关闭]

Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多

Visual Studio 的集成版本控制

使用 Visual Studio 扩展动态添加工具按钮