我们想获取一个性能分析(不是内存分析),以确定它在哪里花费了时间。
我们拥有的AQTime不支持远程分析。
我们不想花时间构建一个完整的D7 IDE开发环境,只为了能够在这台内部机器上使用AQTime对我们的应用程序进行性能分析。
代码有点复杂,我们不想自己测量它。
请问有没有关于远程收集高级别(过程或行号)统计信息的分析器的建议?
你也可以尝试我的免费/开源采样分析器: http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode
(我用它比使用SamplingProfiler获得更好的结果) 它使用各种Delphi调试符号(.map、TD32、.jdbg等)
你可以使用我们的开源TSynLog
类为任何应用程序添加分析功能,不仅限于开发人员计算机。
它不是自动化分析工具,像其他工具一样:你需要修改你的代码。但是,即使没有通信,即使从最终客户端,也可以在请求时远程运行它。
你可以将一些分析调用添加到某些方法代码中,然后进入和离开方法将被记录到文本文件中。然后可用提供的日志查看器,并有一些专用方法来执行分析和识别缓慢的方法。
(来源: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
方法(及其自动离开功能),您拥有了所有所需的信息。
通过逐步进行步骤,您将很快找到应用程序的瓶颈。并且可以根据请求在最终客户端上执行相同操作。
我在几个应用程序中使用了这个功能,并且非常容易地发现了几个瓶颈,即使在特定的硬件、软件和网络配置上(您永远不知道您的客户使用什么),也非常容易。