为什么AQTime即使在没有打开分析时也会降低执行速度,并且可以为它做任何事情?

时间:2010-04-06 12:58:23

标签: performance delphi aqtime

在AQTime for Delphi中,它通过使用区域和触发器等来快速到达故障点。但在我看来,特别是如果你在要分析的区域中有很多代码,那么执行即使没有打开分析,也会显着减慢。

例如,如果我想在程序流程的后期分析一个特定的例程,但不知道那里调用了什么,我认为将此例程仅作为触发器并将线程的初始状态设置为Off ,然后选择“通过例程/行完全检查”。但是,当我执行此操作时,程序执行在触发例程被触发之前已经大大减慢。

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

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

另一个通常更好的解决方法是在没有AQTime的情况下启动应用程序,然后在“准备流程”完成后使用“附加到进程”,但只有当GUI在适当的位置暂停执行或以其他方式提供时才能正常工作合适的时间框架进行连接。在所有情况下都不是这样。

对于为什么会出现这种情况的任何评论,除了尝试减少区域中的代码或稍后附加到流程之外还有什么可做的吗?

5 个答案:

答案 0 :(得分:5)

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

它可以进行仪器和采样分析。 它没有AQTime的所有功能,但至少它是免费的(如果你停止分析,会有非常轻微的性能损失)。

答案 1 :(得分:4)

AQTime是一个仪表分析器。在运行时,它基本上围绕着您选择使用自己的代码进行分析的每个方法(或行,具体取决于您配置选项的方式),如下所示:

begin
    DoStuff();
end;

...变为:

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

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

当分析处于非活动状态时,开销会减少,因为它们不会记录任何内容。但是,方法调用本身还有一些开销,加上try / finally块。

我不知道你能否在AQTime做任何事情来改善这一点,而不是简要介绍。但是,您也可以尝试使用抽样分析器,它可以减少分析器本身的开销,但可能会错过对快速执行的例程的调用。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

您是否尝试过使用

AQtimeHelpers.EnableProfiling(false); 

开始准备然后

AQtimeHelpers.EnableProfiling(True); 

后?

答案 4 :(得分:0)

您必须使用深入分析方法。首先确定需要按程序进行分析的区域,确定需要分析的程序,仅分析它们并仅在需要确定需要注意的确切代码行时切换到行分析。 如果您按行启用应用程序的完整性能分析,AQTime执行的检测将非常繁重,而且收集的数据太多会使应用程序变慢。