【发布时间】:2011-07-07 16:17:14
【问题描述】:
我刚刚完成了一段代码的分析,这占用了太多时间。有问题的代码从一些 std::vectors 和一个 std::set 创建了一个很大的 boost::graph,它们被排序并插入了很多次。然而,令我惊讶的是,大部分时间没有花在排序或插入上,而是花在std::_Iterator_base12::_Orphan_me - AMD CodeAnalyst 报告的 97.27% 上。这是什么功能?它似乎被调用了 ~2200 次,总运行时间是 ~30 秒。
CodeAnalyst 没有给我一个很好的调用堆栈,并且似乎在 120 个左右的字符之后剪切名称,这与 boost 模板类型不匹配。如果有办法改进这一点(我对 CodeAnalyst 还很陌生),请说出来,我可能会提供更好的信息。
【问题讨论】:
-
您确定在分析之前以发布模式编译代码吗?与调试模式相比,许多底层迭代器机制在发布时得到了优化。
-
在性能调优中,意外是意料之中的。程序是否在进行 I/O?如果是这样,那可能是 97%。无论如何,如果你想看看到底发生了什么,give this a try。
-
迭代器已被制成非规范化的 bfd,带有指向其容器的反向指针。你可以关闭所有这些。 Check this out.
-
@Mike 和@Praetorian:谢谢!不,我没有切换到释放模式 (facepalm)。特别是。 Mike,链接的博客文章内容丰富。您介意将其发布为答案吗? (顺便说一句,切换到发布,更大问题的运行时间从 > 40 分钟减少到不到 2 秒......)