C++ 在调试模式下销毁协议缓冲区消息的速度几乎是在发布模式下的500倍

C++ 在调试模式下销毁协议缓冲区消息的速度几乎是在发布模式下的500倍,c++,performance,destructor,protocol-buffers,debug-mode,C++,Performance,Destructor,Protocol Buffers,Debug Mode,在调用main()中删除msg时,使用以下代码和您自己的计时代码。在调试模式下运行时,平均花费的时间是不进行调试时的473倍有人知道为什么会发生这种情况吗?如果是这样的话,有没有办法让这段代码在调试模式下运行得更快? 注意:我正在Windows 7计算机上使用Visual Studio 2008 SP 1 // This file is generated by using the Google Protocol Buffers compiler // to compile a PropMsg.

在调用main()中删除msg时,使用以下代码和您自己的计时代码。在调试模式下运行时,平均花费的时间是不进行调试时的473倍有人知道为什么会发生这种情况吗?如果是这样的话,有没有办法让这段代码在调试模式下运行得更快?

注意:我正在Windows 7计算机上使用Visual Studio 2008 SP 1

// This file is generated by using the Google Protocol Buffers compiler
// to compile a PropMsg.proto file (contents of that file are listed below)
#include "PropMsg.pb.h"

void RawSerializer::serialize(int i_val, PropMsg * o_msg)
{
        o_msg->set_v_int32(i_val);
}
void serialize(std::vector<int> const & i_val, PropMsg * o_msg)
{
    for (std::vector<int>::const_iterator it = i_val.begin(); it != i_val.end(); ++it) {
        PropMsg * objMsg = o_msg->add_v_var_repeated();
        serialize( * it, objMsg);
    }
}

int main()
{
    std::vector<int> testVec(100000);
    PropMsg * msg = new PropMsg;
    serialize(testVec, msg);
    delete msg; // Time this guy
}
下面是我得到的一些示例测试输出:

datatype: class std::vector<int,class std::allocator<int> >
                               num runs:                   10
                              num items:               100000
        deserializing from PropMsg time:               0.0046
            serializing to PropMsg time:               0.0426
                 reading from disk time:               0.7195
                   writing to disk time:               0.0298
              deallocating PropMsg time:                 8.99
datatype:class std::vector
跑步次数:10次
项目数:100000
从PropMsg反序列化时间:0.0046
序列化到PropMsg时间:0.0426
从磁盘读取时间:0.7195
写入磁盘时间:0.0298
取消分配PropMsg时间:8.99

请注意这是如何不受IO限制的。

VS Debug中的STL容器速度非常慢。游戏程序员论坛上充斥着对此的抱怨。人们通常会选择其他实现。但是,从我所读到的内容来看,通过禁用迭代器调试/检查,您可以提前获得性能提升:

#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0

影响调试性能的其他因素是对new和delete的过度调用。内存池可以帮助实现这一点。您尚未提供
PropMsg::add_v\u var\u repeated()
PropMsg::~PropMsg()
的详细信息,因此我无法发表评论。但我假设该类中有一个向量或其他STL容器?

好吧,这是调试模式,所以它会做额外的事情来捕获bug……您的度量有多精确?在我们这个时代,100000不是一个巨大的数字。你应该在main中重复这个过程很多次。
PropMsg.ph.h
包含什么?它相当准确。我多次运行测试并平均结果。我运行了更多的测试,但没有在这里显示它们,因为我想保持问题/信息的简短。PropMsg.pb.h包含PropMsg类的定义,它是在Google Protocol Buffers编译器编译.proto文件时生成的。另外,可能对您有用。昨天,我认为将这两个符号设置为0解决了我的问题。然而,今天,我运行了我的代码,它仍然很慢。根据您的链接,我尝试定义_NO_DEBUG_HEAP环境变量,这很有效。但是,我更喜欢设置一些预处理符号。你知道这两个pound定义是否有效吗(是的,我已经验证了它们确实是被设置的而不是被覆盖的,至少我认为…)。在项目设置中设置预处理器符号与在代码中设置它们是一样的,但是,如果在编译器中执行此操作,则不必担心它们没有在任何一个源文件中设置。对于其中一些,项目设置用户界面中可能有复选框。否则,可以将它们添加到预处理器定义列表中。要在代码中执行,请确保在包含任何C++ STL头之前定义它们。如果您的项目是本机VisualStudio,那么您将有
stdafx.h
,这对实现这一点很有帮助。据我所知,它仅在将调试代码附加到VisualStudio时才相关。它似乎是一个环境变量,而不是预处理器定义。不管您是否设置了该环境变量,如果您在VisualStudio之外运行调试代码,那么显然它应该运行得很快。
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0