使用D7进行远程分析(不是内存分析,而是时间分析...)

4
我们内部有一台机器,启动我们的Delphi 7应用程序比任何其他机器慢20倍。
我们想获取一个性能分析(不是内存分析),以确定它在哪里花费了时间。
我们拥有的AQTime不支持远程分析。
我们不想花时间构建一个完整的D7 IDE开发环境,只为了能够在这台内部机器上使用AQTime对我们的应用程序进行性能分析。
代码有点复杂,我们不想自己测量它。
请问有没有关于远程收集高级别(过程或行号)统计信息的分析器的建议?

采样分析器在我们的情况下不起作用,因为我们相当确定延迟发生在TCP/IP堆栈的深处,而不是在我们的任何一个Delphi单元中。 - RobertFrank
4个回答

3
请看 SamplingProfiler。它不提供“远程”分析,但它也不需要开发环境。只需能够启动待分析的程序(因此必须在同一台机器上运行),并且链接器在.EXE文件所在的文件夹中生成了.MAP文件。如果这是内部使用,那对你来说不应该是一个问题。
如果查看帮助文件,会发现一些方法可以仅对程序的特定部分进行分析,而AQTime做不到这一点。如果您知道问题出在某个特定位置,例如启动代码,那么这将有所帮助。

@Thomas:你能否扩展一下并发布一个答案? - menjaraz
1
@menjaraz:没有什么需要详细说明的,我只是提到SamplingProfiler也接受可执行文件中的TD32调试部分,而不仅仅是MAP文件,对于措辞上的歧义表示抱歉。 - Thomas
@Thomas:感谢您考虑我的评论。 - menjaraz
@Mason:“如果你查看帮助文件,你甚至会发现一些方法可以只对程序的某些部分进行分析,而 AQTime 无法做到这一点。” --> 在 AQTime 中,您可以添加“区域”来实现这一点。你需要查看帮助文件 ;-) - Giel
@Mason:这是在V4中,也就是我在2005年尝试的第一个版本。如果这个功能一直存在,我也不会感到惊讶。 - Giel

1

1
为什么不在机器上安装AQTime并将其用作独立的分析工具呢?完全不需要使用“整个D7 IDE开发环境”。

只要他们拥有的许可证允许这样做。自第7版以来,它变得非常严格 - 如果您在开发机器之外出现奇怪的行为,则可以使用远程分析模块。 他们可以尝试免费版本,也许已经足够了。 - Mad Hatter
我并不熟悉 AQTime 的除最基本用法以外的其他功能,因此我不知道它可以在没有开发环境的情况下使用。(我们有一个浮动许可证,所以这不是问题。)另外,除了 .exe 文件之外,我需要从我的开发机器上移动哪些文件到测试机器上?感谢您上面的建议以及您能够提供的任何其他信息。 - RobertFrank
2
@Robert:你只需要exe文件。确保它编译时包含调试信息。如果我没记错,AQTime手册详细解释了这一点。 - Giel

1

你可以使用我们的开源TSynLog为任何应用程序添加分析功能,不仅限于开发人员计算机。

它不是自动化分析工具,像其他工具一样:你需要修改你的代码。但是,即使没有通信,即使从最终客户端,也可以在请求时远程运行它。

你可以将一些分析调用添加到某些方法代码中,然后进入和离开方法将被记录到文本文件中。然后可用提供的日志查看器,并有一些专用方法来执行分析和识别缓慢的方法。

Profiling methods from log
(来源:synopse.info)

日志机制可用于跟踪递归调用。它可以使用基于接口的机制记录您进入和离开任何方法的日志:

procedure TMyDB.SQLExecute(const SQL: RawUTF8);
var ILog: ISynLog;
begin
  ILog := TSynLogDB.Enter(self,'SQLExecute');
  // do some stuff
  ILog.Log(sllInfo,'SQL=%',[SQL]);
end; // when you leave the method, it will write the corresponding event to the log

它将被记录为:

20110325 19325801  +    MyDBUnit.TMyDB(004E11F4).SQLExecute
20110325 19325801 info   SQL=SELECT * FROM Table;
20110325 19325801  -    MyDBUnit.TMyDB(004E11F4).SQLExecute 00.000.507

这里的方法名在代码中被设置为 ('SQLExecute')。但是如果您有一个相关的 .map 文件,日志机制就能够读取该符号信息,并写入事件的确切行号。您甚至可以使用高度压缩的版本的 .map 文件 (900 KB .map -> 70 KB .mab,即比 zip 或 lzma 压缩更好),或者在构建时将其内容嵌入可执行文件中。

因此,在方法级别添加分析仅仅是在方法开头添加一行代码,如下所示:

procedure TMyDB.SQLExecute(const SQL: RawUTF8);
begin
  TSynLogDB.Enter;

  // do some stuff

end; // when you leave the method, it will write the corresponding event to the log

高分辨率时间戳也记录在文件中(这里是00.000.507)。有了这个,您将能够使用来自客户端的数据对应用程序进行分析,以及在其真实计算机上进行。通过Enter方法(及其自动离开功能),您拥有了所有所需的信息。

通过逐步进行步骤,您将很快找到应用程序的瓶颈。并且可以根据请求在最终客户端上执行相同操作。

我在几个应用程序中使用了这个功能,并且非常容易地发现了几个瓶颈,即使在特定的硬件、软件和网络配置上(您永远不知道您的客户使用什么),也非常容易。


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