我最近将一些旧代码从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)在Debug模式下进行编译时,此基本程序性能会急剧下降:
在版本中,VS2015生成更快的代码:
如何使Visual Studio调试代码如此缓慢?他们是否在STL容器上扩展了_DEBUG检查(
std::deque::push_back
是此处唯一使用CPU的相关代码)? 最佳答案
对于MSVC++的每个主要版本,Microsoft几乎都提高了对容器和迭代器执行的验证级别。
您可以通过禁用某些验证来减少调试运行的时间。例如,将以下内容添加到源文件的顶部:
#define _HAS_ITERATOR_DEBUGGING 0
请注意,我怀疑上述配置宏也将减少VS2010调试运行时。
有关详细信息,请参见以下文档:
_ITERATOR_DEBUG_LEVEL
通常,除非运行时无法忍受,否则我建议您启用迭代器调试功能。这对于防止错误使用迭代器非常有帮助。