一个骇客的故事
日期是12/02/10。离圣诞节还有几天,我作为一名 windows 程序员已经遭遇了严重的障碍。我尝试使用 AQTime、Sleepy、Shiny 和 Very Sleepy,而 VTune 正在安装中。我尝试使用 VS2008 分析器,但它往往无法理解并且非常困难。我使用了随机暂停技术,检查了调用树和函数跟踪。但令人难受和痛苦的事实是,我正在处理的应用程序包含超过一百万行代码,可能还有另外一百万行的第三方应用程序。
我需要更好的工具。我阅读了其他话题。 我尝试了每个话题中列出的每个分析器。必须有比这些低劣而昂贵的选项或为几乎没有收益而做出的荒谬数量的工作更好的东西。更进一步使问题复杂化的是,我们的代码有很多线程,并运行许多 Qt 事件循环,其中一些由于时间延迟而在重载时崩溃。不要问我为什么我们要运行多个事件循环,没有人可以告诉我。
在 Windows 环境中有类似 Valgrind 的选项吗?
有比我已经尝试过的一大堆破碎工具更好的东西吗?
有没有旨在与 Qt 集成并具有事件队列有用显示的工具?
以下是我尝试的所有工具列表,其中真正有用的工具用斜体表示:
- AQTime: 相当不错!在深度递归时会有些麻烦,但对于这些情况,调用图是正确的,并且可以用来澄清任何可能存在的困惑。虽然不是完美的工具,但值得一试。它可能适合您的需求,并且大部分时间对我来说足够好。
- 调试模式下的随机暂停攻击: 很多时候信息不足。一个好的工具,但不是完整的解决方案。
- Parallel Studios: 核心选项。比较突兀、奇怪,但功能强大。 我认为您应该使用30天的评估版,并确定它是否适合您的需求。 它确实很酷。
- AMD Codeanalyst: 非常棒,易于使用,但非常容易崩溃,但我认为这是环境问题。 我建议尝试一下,因为它是免费的。
- Luke Stackwalker: 在小型项目上运行良好,我们的项目运行良好有点费劲。 一些好的结果,对于我的个人任务,它绝对可以取代Sleepy。
- PurifyPlus: 不支持Win-x64环境,尤其是Windows 7。否则非常出色。 我在其他部门的一些同事中有很多人都很喜欢它。
- VS2008 Profiler: 在函数跟踪模式下以所需的分辨率产生超过100GB的输出。好的方面是可以产生可靠的结果。
- GProf: 需要GCC才能达到中等效果。
- VTune: VTune的W7支持边缘犯罪。否则非常出色。
- PIN: 我需要自己编写工具,因此这是一种最后的选择。
- Sleepy\VerySleepy: 对于较小的应用程序有用,但在这里无法帮助我。
- EasyProfiler: 如果您不介意手动注入代码以指示在哪里进行插装,则还不错。
- Valgrind:仅限*nix环境,但在该环境下非常出色。
- OProfile:仅限Linux。
- Proffy:他们枪杀了野马。
建议的工具我没有尝试过:
- XPerf:
- Glowcode:
- Devpartner:
注:目前使用Intel环境、VS2008、boost库以及Qt 4+,还有一个让人头疼的问题:通过Trolltech实现的Qt/MFC集成。
现在:将近两周过去了,看起来我的问题已经解决了。感谢各种工具(包括列表中的几乎所有工具和我个人的一些技巧),我们找到了主要的瓶颈。然而,我仍将继续测试、探索和尝试新的分析器以及新的技术。为什么?因为我要向你们证明自己能行,而你们很棒。这可能会稍微延长时间表,但我仍然非常兴奋地尝试新工具。
简介
除了许多其他问题外,最近一些组件被切换到了错误的线程模型,导致由于底层代码突然不再是多线程的,出现了严重的停顿问题。我不能透露更多信息,因为这违反了我的保密协议,但我可以告诉你,即使是普通的检查或正常的代码审核也永远不会发现这个问题。没有分析器、调用图和随机暂停结合起来使用,我们仍然会对美丽的蓝色天空弥漫着怒火。幸运的是,我与一些我曾经遇到过的最好的黑客共事,并且我可以访问一个充满了优秀工具和优秀人才的“宇宙世界”。
各位,我非常感激你们,遗憾的是我没有足够的声誉去奖励每个人。我仍然认为这是一个比SO上现有答案更好的问题。因此,在接下来的三个星期里,我将提供我能够提供的最大赏金,并授予一个我认为不常见的最好的工具的答案。三周后,我们希望积累一个分析器的最终概况。
精华版
使用性能分析工具。即使是 Ritchie、Kernighan、Bentley 和 Knuth 也在使用它们。不管你认为自己有多强,都请使用性能分析工具。如果你目前的工具不能达到预期效果,就寻找其他工具。如果找不到合适的工具,就自己开发一个。如果自己无法开发或者只遇到小的问题,或者卡住了,可以使用随机暂停技术。如果所有的方法都失败了,可以雇用一些研究生来开发性能分析工具。
长远视角版
因此,我想写一篇回顾文章。我选择与 Parallel Studios 大量合作,部分原因是它实际上是建立在 PIN 工具之上的。由于曾经与一些涉及研究人员进行过学术交往,所以我认为这可能是一种质量标志。幸运的是,我是正确的。虽然 GUI 有点糟糕,但我发现 IPS 非常有用,尽管我不能轻易地为每个人推荐它。关键是,在许多其他性能分析工具(如 AQT)中,没有明显的方法来获取代码行级别的命中次数,这是我用于检查分支选择率等问题非常有用的东西。总体而言,我也喜欢使用 AQTime,并且我发现他们的支持非常响应。同样需要澄清的是:他们的许多功能都不起作用,其中一些在 Win7x64 上甚至会导致崩溃。XPerf 的性能表现也很出色,但对于需要进行详细采样的某些应用程序来说,速度非常慢。
目前,我必须说,我认为在 W7x64 环境中,没有一个明确的选项可以对 C++ 代码进行性能分析,但肯定存在一些根本不提供任何有用服务的选项。