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) [关闭]