【问题标题】:Why AQTime slows execution even when profiling is not on, and can anything be done for it?为什么即使没有启用分析,AQTime 也会减慢执行速度,并且可以为它做任何事情吗?
【发布时间】:2026-01-31 18:55:02
【问题描述】:

在 Delphi 的 AQTime 中,它通过使用区域和触发器等来快速解决问题点。但在我看来,特别是如果您在这些区域中有很多代码要分析,那么执行即使没有开启分析,也会显着减慢速度。

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

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

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

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

关于为什么会这样,除了尝试减少这些区域的代码或稍后附加到流程之外,还有什么可以做的吗?

【问题讨论】:

  • 如果您不知道例程的名称,它不是很具体吗?
  • 您是否向 AutomatedQA 支持寻求帮助?
  • 我知道启动分析过程的例程(我将其添加为触发器),但例程本身可以对应用程序的所有区域(或多或少)产生大量调用链,所以我不知道不知道要添加什么代码作为区域。 -不,我还没有问过 AutomatedQA 这方面的问题,我想我可以采用解决方法,但想知道是否有人有更多信息。
  • 您应该提及您使用的 AQTime 版本。自旧版本以来,性能已显着提高。此外,它们通常能很好地响应支持电话,因此您可能仍想尝试一下。

标签: performance delphi aqtime


【解决方案1】:

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

它可以进行检测和采样分析。 它没有 AQTime 的所有功能,但至少它是免费的(如果您停止分析,性能损失非常小)。

【讨论】:

  • 看起来不错 - 我会检查一下...看起来很适合 Delphi 合作伙伴 DVD。
  • 谢谢 - 我也可以试试这个。
  • 我觉得 AsmProfiler_Sampling v1.0.7.22 比最新 Delphi 版本捆绑的 AqTime 更好
【解决方案2】:

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

begin
    DoStuff();
end;

...变成:

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

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

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

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

【讨论】:

  • 谢谢,这也是我的假设。在我看来,即使在分析例程级别(而不是行级别)时效果如此之大,这似乎有点令人惊讶。但我想即使是 try-finally 块和额外的方法调用,即使没有真正的内容也会加起来。
【解决方案3】:

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

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

【讨论】:

  • 我的意思是两者或多或少都会产生相同的效果。但是我的应用程序很大(超过一百万行代码)。实际上,我什至根本无法使用完全逐行检查,因为当我尝试使用它启动应用程序时,分析会在几秒钟后自动停止。如果我从根本上减少区域,这个问题就会消失,所以显然行数有一些上限,之后问题(除了性能)开始出现。我知道应该使用向下钻取方法,但是每次运行需要一个小时左右,我不想做太多...... :(
【解决方案4】:

您是否尝试过使用

AQtimeHelpers.EnableProfiling(false); 

在你的准备开始,然后

AQtimeHelpers.EnableProfiling(True); 

之后?

【讨论】:

  • 否 - 如果可能的话,我不想修改我的代码,但很高兴知道存在这样的事情。如果我在某些时候无法使用其他解决方法,我可能会尝试一下 - 谢谢!
【解决方案5】:

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

【讨论】:

  • 我知道应该使用向下钻取方法,但是每次运行即使没有分析需要例如 15 分钟,我也不想做太多...... :(。但是我想我将不得不忍受它。
最近更新 更多