AQTime 是如何做到的?

12

我一直在测试性能和内存分析工具AQTime,以便了解是否值得为我的Delphi应用程序花费大量的$$$。

令我惊奇的是,它可以在不修改应用程序源代码以及不添加过多的调试运行时间的情况下,提供源代码行级别的性能追踪(其中包括每行被执行的次数和该行所需的时间)。

他们如此高效地实现这一点,让我想到可能存在我不知道的一些技术/方法,这些技术/方法可能对我有用。

你知道他们使用哪种方法来捕获执行线路而无需进行代码更改吗?是否有其他分析工具也可以进行非侵入式的逐行检查,如果有,它们是否使用相同的技术?


AQTime太棒了。我喜欢它。强烈推荐。 - Warren P
4个回答

9

我为Delphi开发了一个开源的性能分析器,它可以做到同样的事情:http://code.google.com/p/asmprofiler/

虽然它不是完美的,但它是免费的 :-). 它也使用了Detour技术。 它存储了每个调用(您必须手动设置要分析的函数), 因此可以制作一个精确的调用历史树,包括时间表!


2
谢谢,安德烈,干得好。我会试一下的。Delphi社区真的需要一个集成到Delphi IDE中的分析器。既然你已经开源了它,你可能想考虑将它捐赠给Embarcadero,他们可能会将其包含在其中。或者以每个200美元的价格进行市场营销。 - lkessler
现在它确实有一个!RAD Studio XE Enterprise和Architect现在包含AQTime Lite。它已经完全集成在内。如果您购买了AQTime Pro,它将完全整合到IDE中,或者您可以单独使用它。 - Warren P

7
这只是猜测,但也许AQtime基于类似Microsoft Detours的技术?

Detours是一个库,用于在x86、x64和IA64计算机上检测任意Win32函数。Detours通过重新编写目标函数的内存代码来拦截Win32函数。


除非有人知道不同的答案,否则我会给你答案。 - lkessler
4
有些人称之为“hooking”。MadCodeHook是一个用于Delphi的工具,可以让你对代码进行程序化插装。有趣的是,代码钩取的一个限制是,无法对太短以至于不允许内联修改的函数进行钩取。 AQTime会报告那些太小而无法进行钩取的函数,你所能做的就是忽略它们。这让我想到,可以确定的是,钩取(插装、拦截)就是AQTime所做的事情。 - Warren P

2
我不了解Delphi,但C应用程序调试器可以相对容易地进行逐行分析 - 它可以加载代码并将每个代码路径与一块代码相关联。然后它可以在所有条件跳转指令上中断,只需观察并查看哪个代码路径被采用。像gdb这样的调试器可以相对高效地运行,因为它们通过内核工作,并且不修改代码,只是在执行每一行时得到通知。如果某些原因导致块过早退出(longjmp),调试器可以钩住它,并找出发生时它进入块的程度,并仅递增那些行。

当然,编码仍然很困难,但是当我说容易时,我的意思是您可以在不浪费时间中断每个指令以更新计数器的情况下完成它。

2

已经停运的TurboPower为Delphi开发者提供了一个名为Sleuth QA Suite的出色分析与剖析工具。我觉得它比AQTime更加简单,而且使用起来得到的结果更有意义。也许值得去寻找一下——例如在eBay上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接