我最近将一些遗留代码从Visual Studio 2010 32位移植到Visual Studio 2015 64位。
我的CPPUNIT测试速度时间(在调试模式下)乘以两个以上。我真的很惊讶所以我试图在较小的代码上隔离和重现问题:
#include <deque>
#include <iostream>
#include <string>
#include <time.h>
class Message
{
public:
Message(const std::string &shortDescription)
: m_shortDescription(shortDescription)
{
m_details.push_back( shortDescription );
}
inline const std::string& str() const { return m_shortDescription; }
private:
std::string m_shortDescription;
typedef std::deque<std::string> Details;
Details m_details;
};
int main( int argc, char* argv[] )
{
std::cout << sizeof(size_t) << std::endl;
clock_t started = clock();
std::string str;
for (size_t i = 0; i != 1000000; ++i)
{
Message msg("foo");
}
std::cout << static_cast<double>(clock()-started)/CLOCKS_PER_SEC << "secs" << std::endl;
std::cin >> str;
return 0;
}
使用Visual Studio 2015(x64或x86)在调试模式下编译时,此基本程序性能会急剧下降:
在Release中,VS2015生成更快的代码:
如何使Visual Studio Debug代码变得如此之慢?他们是否扩展了对STL容器的_DEBUG检查(std::deque::push_back
是这里使用CPU的唯一代码段吗?)
答案 0 :(得分:2)
Microsoft已经增加了对容器和迭代器执行的验证级别,几乎与MSVC ++的每个主要版本一致。
您可以通过禁用某些验证来减少调试运行所需的时间。例如,将以下内容添加到源文件的顶部:
#define _HAS_ITERATOR_DEBUGGING 0
请注意,上面的配置宏也会减少VS2010的调试运行时间,我怀疑。
有关详细信息,请参阅以下文档:
一般情况下,我建议启用迭代器调试,除非运行时命中无法忍受。它在防止错误地使用迭代器方面非常有用。
答案 1 :(得分:1)
绝对优化。您可以进行一项众所周知的更改 - 您可以尝试的其他更改,并在调试版本中确定哪些是正常的。 (优化可能会使步骤变得困难。)
在您的项目属性配置集C / C ++ - &gt;代码生成 - &gt;基本运行时检查为默认值。
您的代码的x86调试时间从大约17秒下降到9秒,只需更改一次。
我只有VS 2013才能进行测试,但在VS 2015中也会发生同样的事情。
比较生成的代码或在this blog post中阅读。