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

C++ 为什么相同的代码从VS2010迁移到VS2015时速度要慢两倍?,c++,visual-studio-2010,stl,visual-studio-2015,C++,Visual Studio 2010,Stl,Visual Studio 2015,我最近将一些遗留代码从VisualStudio2010 32位移植到VisualStudio2015 64位 我的单元测试速度时间(在调试模式下)乘以两倍以上。我真的很惊讶,所以我尝试在较小的代码段上隔离并重现问题: #include <deque> #include <iostream> #include <string> #include <time.h> class Message { public: Message(const s

我最近将一些遗留代码从VisualStudio2010 32位移植到VisualStudio2015 64位

我的单元测试速度时间(在调试模式下)乘以两倍以上。我真的很惊讶,所以我尝试在较小的代码段上隔离并重现问题:

#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;
}
#包括
#包括
#包括
#包括
类消息
{
公众:
消息(const std::string和shortDescription)
:m_shortDescription(shortDescription)
{
m_详细信息。推回(简短描述);
}
内联常量std::string&str()常量{return m_shortDescription;}
私人:
std::字符串m_shortDescription;
typedef std::deque详细信息;
详细信息m_详细信息;
};
int main(int argc,char*argv[])
{

std::cout绝对是优化。有一个众所周知的改变,你可以做-其他的你可以试验,并决定什么是调试版本中的好。(优化可能会使步骤变得困难。)

在项目属性配置中将C/C++->代码生成->基本运行时检查设置为默认值

您的代码的x86调试时间从大约17秒减少到了9秒,只做了一次更改

我只有VS2013可以测试,但同样的事情也发生在VS2015中


比较生成的代码或阅读中的相关内容。

微软提高了容器和迭代器上执行的验证级别,这与MSVC++的每个主要版本相当

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

#define _HAS_ITERATOR_DEBUGGING 0
请注意,我怀疑上面的配置宏还将减少VS2010调试运行时

有关详细信息,请参见以下文档:


一般来说,我建议启用迭代器调试,除非运行时的影响无法承受。这对防止错误使用迭代器非常有帮助。

这是正常的。调试版本未优化,正在做额外的工作。2015在调试模式中添加了额外的功能,因此需要做更多的工作。要做的工作是原来的两倍。。…这是不是太过分了?不可能停用这个额外的检查?既然你无论如何都要部署发布版本,为什么你要关心调试版本的速度?如果你部署调试版本,你就错了。是的,它看起来太过分了。但我们不知道幕后会发生什么。好的一面是:版本v版本快得多。我的电脑速度很慢,我也注意到有时候2015看起来很慢,但我没有好奇心去测试速度。除非VC++编译器的人突然出现,否则我怀疑我们会有很多答案。我唯一能建议的是并排看两个缺点,看看它们之间的区别顺便说一句,调试定时是通过附加的调试器完成的(我想不是,但有时明显的问题不会被问到)?谢谢Michael,我会尝试一下,但正如你所说的,只是为了检查一下,因为我更喜欢启用迭代器调试。