从VS2010迁移到VS2015时,为什么相同的代码速度慢两倍?

时间:2016-04-04 08:59:08

标签: c++ visual-studio-2010 stl visual-studio-2015

我最近将一些遗留代码从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)在调试模式下编译时,此基本程序性能会急剧下降:

  • Visual Studio 2010,Debug,x64:~10s
  • Visual Studio 2010,Debug,x86:~10s
  • Visual Studio 2015,Debug,x64:~20s
  • Visual Studio 2015,Debug,x86:~20s

在Release中,VS2015生成更快的代码:

  • Visual Studio 2010,Release,x64:~1.3s
  • Visual Studio 2010,Release,x86:~1.3s
  • Visual Studio 2015,发布,x64:~0.2s
  • Visual Studio 2015,Release,x86:~0.2s

如何使Visual Studio Debug代码变得如此之慢?他们是否扩展了对STL容器的_DEBUG检查(std::deque::push_back是这里使用CPU的唯一代码段吗?)

2 个答案:

答案 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中阅读。