【发布时间】:2011-05-22 15:08:18
【问题描述】:
黑客的故事
日期是 2010 年 12 月 2 日。圣诞节前的日子一天天过去,作为一名 Windows 程序员,我几乎遇到了重大障碍。我一直在使用 AQTime,我试过昏昏欲睡,闪亮,非常困倦,正如我们所说,VTune 正在安装。我曾尝试使用 VS2008 分析器,它一直在受到积极的惩罚,而且常常是不理智的。我使用了随机暂停技术。我检查了调用树。我已经启动了函数跟踪。但令人悲痛的事实是,我正在使用的应用程序有超过一百万行代码,可能还有另外一百万行第三方应用程序。
我需要更好的工具。 我已经阅读了其他主题。我已经尝试了每个主题中列出的每个分析器。必须有比这些垃圾和昂贵的选择更好的东西,或者几乎没有收益的可笑工作量。更复杂的是,我们的代码是重线程的,并且运行了许多 Qt 事件循环,其中一些非常脆弱,以至于由于时间延迟而在繁重的仪器下崩溃。不要问我为什么要运行多个事件循环。没有人能告诉我。
在 Windows 环境中是否有更多类似于 Valgrind 的选项?
还有什么比我已经尝试过的大量损坏的工具更好的吗?
是否有任何设计用于与 Qt 集成,也许可以在队列中显示有用的事件?
我尝试过的工具的完整列表,其中真正有用的工具用斜体表示:
- AQTime:相当不错!深度递归有一些问题,但调用图在这些情况下是正确的,可用于消除您可能遇到的任何困惑。不是一个完美的工具,但值得一试。它可能适合您的需求,而且在大多数情况下对我来说肯定已经足够了。
-
调试模式下的随机暂停攻击:信息不足。
一个很好的工具,但不是一个完整的解决方案。 - Parallel Studios:核选项。突兀,怪异,疯狂的强大。我认为您应该进行 30 天评估,并确定它是否合适。这也太酷了。
- AMD Codeanalyst:很棒,易于使用,非常容易崩溃,但我认为这是环境问题。我建议您尝试一下,因为它是免费的。
- Luke Stackwalker: 在小型项目上运行良好,但在我们的项目上运行起来有点困难。虽然取得了一些不错的效果,但它绝对可以取代 Sleepy 来完成我的个人任务。
- PurifyPlus: 不支持 Win-x64 环境,最突出的是 Windows 7。否则非常好。我在其他部门的许多同事都对此发誓。
- VS2008 Profiler:在函数跟踪模式下以所需的分辨率产生 100+gigs 范围内的输出。从好的方面来说,会产生可靠的结果。
- GProf:需要 GCC 才能达到中等效果。
- VTune:VTune 的 W7 支持近乎犯罪。其他方面都很好
- PIN:我需要破解自己的工具,所以这是最后的手段。
- Sleepy\VerySleepy:适用于较小的应用程序,但我在这里失败了。
- EasyProfiler:如果您不介意手动注入代码来指示检测位置,这还不错。
- Valgrind:仅限 *nix,但在那种环境中非常好。
- OProfile:仅限 Linux。
- Prooffy:他们射野马。
我没有尝试过的建议工具:
- XPerf:
- Glowcode:
- 开发伙伴:
注意事项: 目前的英特尔环境。 VS2008,提升库。 Qt 4+。以及它们中最糟糕的一个:通过 trolltech 进行的 Qt/MFC 集成。
现在:差不多两周后,看来我的问题已经解决了。借助各种工具,包括列表中的几乎所有内容以及我的一些个人技巧,我们找到了主要瓶颈。但是,我将继续测试、探索和尝试新的分析器以及新技术。为什么?因为我欠你们,因为你们摇滚。它确实会稍微减慢时间线,但我仍然很高兴能继续尝试新工具。
概要
在许多其他问题中,最近一些组件被切换到了不正确的线程模型,由于我们下面的代码突然不再是多线程的,导致严重的挂起。我不能说更多,因为它违反了我的 NDA,但我可以告诉你,这永远不会通过随意检查甚至正常的代码审查来发现。如果没有剖面仪、callgraphs 和随机停顿,我们仍然会对美丽的蓝色天空弧线大喊大叫。值得庆幸的是,我与一些我见过的最优秀的黑客一起工作,并且我可以接触到一个充满了伟大工具和伟大人物的令人惊叹的“诗句”。
各位大侠,我非常感激,但很遗憾我没有足够的声望来奖励你们每一个人。我仍然认为这是一个重要的问题,可以得到比我们迄今为止在 SO 上得到的更好的答案。
因此,在接下来的三周中,我每周都会提供我能负担得起的最大赏金,并用我认为不是常识的最好工具来奖励答案。三周后,如果您能原谅我的双关语,我们希望我们已经积累了分析器的明确概况。
外卖
使用分析器。它们对 Ritchie、Kernighan、Bentley 和 Knuth 来说已经足够好了。我不在乎你认为你是谁。使用分析器。如果你有的一个不起作用,那就找另一个。如果找不到,请编码一。如果您无法编写代码,或者这是一个小问题,或者您只是卡住了,请使用随机暂停。如果一切都失败了,请聘请一些研究生来做一个分析器。
更长远的观点
所以,我认为写一些回顾会可能会很好。我选择与 Parallel Studios 广泛合作,部分原因是它实际上是建立在 PIN 工具之上的。在与一些相关研究人员进行过学术交流后,我觉得这可能是某种品质的标志。谢天谢地,我是对的。虽然 GUI 有点可怕,但我发现 IPS 非常有用,尽管我不能轻松地向所有人推荐它。至关重要的是,没有明显的方法来获取行级命中计数,这是 AQT 和许多其他分析器提供的,我发现它对于检查分支选择率非常有用。在网络上,我也很喜欢使用 AQTime,而且我发现他们的支持非常灵敏。再次,我必须证明我的建议:他们的许多功能都不能很好地工作,其中一些在 Win7x64 上非常容易崩溃。 XPerf 的表现也令人钦佩,但对于在某些类型的应用程序上获得良好读取所需的采样细节而言,速度非常慢。
现在,我不得不说,我认为在 W7x64 环境中分析 C++ 代码没有明确的选项,但肯定有一些选项根本无法执行任何有用的服务。
【问题讨论】:
-
您是否考虑过换一份工作? :)
-
我还能去哪里解决这么难的谜题?我想我可以回到内核黑客领域,但这并不值得。
-
@Kos 我认为要使 gprof 有任何用途,您必须使用使用 -pg 编译的 gcc 工具集,否则它不会生成 gprof.out 文件。在 OP 的情况下,听起来他正在使用 msvc,这排除了使用 gprof。再说一次,如果名单上的其他人未能满足他的需求,我认为 gprof 对他来说不会更好
-
@Marc Gravell 这很公平,我想.... 这对我来说似乎是一个奇怪的启发式方法,维护得最好的帖子突然进入社区领域,有效地产生了一种情况,即更多您更新并维护您的问题或答案,在整个社区的眼中,您从维护中获得的越少。我应该把这个带到 meta 吗?
-
鉴于我现在对分析器的了解,有人想要回顾展吗?
标签: c++ qt optimization profiling profiler