我最近将一些旧代码从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模式下进行编译时,此基本程序性能会急剧下降:
  • Visual Studio 2010,调试,x64:〜10s
  • Visual Studio 2010,Debug,x86:〜10s
  • Visual Studio 2015,调试,x64:〜20s
  • Visual Studio 2015,调试,x86:〜20s

  • 在版本中,VS2015生成更快的代码:
  • Visual Studio 2010版本x64:〜1.3s
  • Visual Studio 2010版本x86:约1.3秒
  • Visual Studio 2015版本x64:〜0.2s
  • Visual Studio 2015版本x86:〜0.2s

  • 如何使Visual Studio调试代码如此缓慢?他们是否在STL容器上扩展了_DEBUG检查(std::deque::push_back是此处唯一使用CPU的相关代码)?

    最佳答案

    对于MSVC++的每个主要版本,Microsoft几乎都提高了对容器和迭代器执行的验证级别。

    您可以通过禁用某些验证来减少调试运行的时间。例如,将以下内容添加到源文件的顶部:

    #define _HAS_ITERATOR_DEBUGGING 0
    

    请注意,我怀疑上述配置宏也将减少VS2010调试运行时。

    有关详细信息,请参见以下文档:
  • _ITERATOR_DEBUG_LEVEL
  • Debug Iterator Support
  • Checked Iterators

  • 通常,除非运行时无法忍受,否则我建议您启用迭代器调试功能。这对于防止错误使用迭代器非常有帮助。

    07-24 17:59
    查看更多