时间:2011-07-07 16:17:15

标签: c++ profiling

我刚刚完成了一段占用太多时间的代码块。有问题的代码从一些std :: vectors和一个std :: set创建一个大的boost :: graph,它们被排序并插入很多次。但是,我很惊讶地发现,大多数时间并没有用于排序或插入,而是在std::_Iterator_base12::_Orphan_me - 由AMD CodeAnalyst报告的97.27%。这个功能是什么?它似乎被称为~2200次,总运行时间约为30秒。

CodeAnalyst并没有给我一个非常好的调用堆栈,并且似乎在120个左右的字符之后剪切了名称,这与boost模板类型不匹配。如果有办法改进这一点(我对CodeAnalyst很新),请说出来,我可以提供更好的信息。

1 个答案:

答案 0 :(得分:1)

答案是在发布模式下运行探查器,请参阅performance killer -Debug Iterator Support in Visual studio

  

_SECURE_SCL启用的迭代器检查执行最少的检查,作为最后一行安全防护...因为它在发布模式下默认启用,所以努力实现最小的性能损失。因此,当它启用时,虽然迭代器有指向其容器的指针,但容器没有指向迭代器的指针......

     

Orcas中的交换修复使每个标准容器拥有一个额外的动态分配对象,富有想象力地称为" aux对象"。 每个容器都有一个指向其aux对象的指针,该对象保存指针返回容器。每个迭代器,而不是直接指向其父容器的指针,现在拥有指向其父容器的aux对象的指针......

     

性能问题是 aux对象,但不可避免...... 不是免费的。每个标准容器现在都更大,因为它必须保存指向其aux对象的指针。 aux对象必须动态分配,占用更多空间并占用更多时间。并且_SECURE_SCL在从迭代器到其父容器时执行双重间接。