6

在 Delphi 的 AQTime 中,它通过使用区域和触发器等来快速解决问题。但在我看来,特别是如果您在要分析的区域中有很多代码,那么执行速度会大大减慢即使配置文件未打开。

例如,如果我想在程序流的后期分析一个特定的例程,但不知道那里调用了什么,我想把这个例程只作为触发器,线程的初始状态为 Off,然后选择“按例程/线路进行全面检查”。但是,当我这样做时,在触发例程被击中之前,程序执行速度已经大大减慢。

例如,如果“准备流程”在没有 AQTime 的情况下大约需要 5 分钟,那么当我在禁用分析的情况下运行它时,它已经运行了 30 分钟,即使我知道还没有达到触发器,它仍然会继续运行。

我知道我可以尝试通过减少分析的例程/行的数量来解决这个问题,但这对我来说并不是一个很好的解决方案,因为一旦我进入实际的触发例程,我想分析所有这些。

另一个通常更好的解决方法是在没有 AQTime 的情况下启动应用程序,然后在“准备流程”完成后使用附加到进程,但这只有在 GUI 中的适当位置暂停执行或以其他方式提供合适的时间范围时才有效用于连接。在所有情况下,情况并非如此。

关于为什么会这样的任何评论,除了尝试减少这些区域的代码或稍后附加到流程之外,还有其他事情要做吗?

4

5 回答 5

5

好吧,你当然可以试试我的免费分析器 :-)
http://code.google.com/p/asmprofiler/

它同时具有检测和采样分析功能。它没有 AQTime 的所有功能,但至少它是免费的(如果您停止分析,性能损失很小)。

于 2010-04-06T13:30:42.393 回答
4

AQTime 是一个检测分析器。在运行时,它基本上围绕着您选择使用自己的代码进行分析的每个方法(或行,取决于您如何配置选项),有点像这样:

begin
    DoStuff();
end;

...变成:

begin
    AQTimeEnter('MethodName');
    try
        DoStuff();
    finally
        AQTimeLeave('MethodName');
    end;
end;

它直接在可执行文件中执行此操作,而不是通过修改您的源代码,但效果基本相同。当分析处于活动状态时,这些调用会产生相当大的开销,因为它们会触发很多,并记录大量信息。

当分析处于非活动状态时,开销较少,因为它们不记录任何内容。但是,方法调用本身以及 try/finally 块仍然存在一些开销。

我不知道您是否可以在 AQTime 中做些什么来改善这一点,而不是减少配置文件。但是,您也可以尝试使用采样分析器,它对分析器本身的开销较小,但可能会错过对快速执行例程的调用。

于 2010-04-06T13:24:11.537 回答
2

那么“通过例程/线路进行全面检查”是什么意思。Routines 和 Lines 之间有很大的不同。分析例程不应使您的应用程序减慢太多。它不适合我。按行分析可能非常慢,我认为这就是您现在正在做的事情。

一般来说,这个想法是首先按例程进行分析,找到瓶颈,然后逐行分析那些(并且只有那些)例程。

于 2010-04-06T13:37:25.237 回答
0

您是否尝试过使用

AQtimeHelpers.EnableProfiling(false); 

在你的准备开始,然后

AQtimeHelpers.EnableProfiling(True); 

后?

于 2010-04-06T14:03:59.020 回答
0

您必须使用向下钻取方法。首先通过过程确定需要分析的区域,确定哪些过程需要分析,只分析它们,只有在需要精确定位需要注意的代码行时才切换到行分析。如果您按行启用应用程序的完整分析,AQTime 执行的检测将非常繁重,并且收集的数据如此之多,它将大大降低您的应用程序的速度。

于 2010-04-06T20:10:47.543 回答