我们内部有一台机器,它启动 Delphi 7 应用程序的速度比任何其他机器慢 20 倍。
我们希望获得性能配置文件(而不是内存配置文件)来定位它花费时间的位置。
我们发现,我们拥有的 AQTime 不进行远程分析。
我们不希望花时间构建一个完整的 D7 IDE 开发环境,这样我们就可以使用 AQTime 在这台内部机器上分析我们的应用程序。
代码有点太复杂,我们不想自己测量它。
关于远程收集高级(过程或行号)统计信息的分析器有什么建议吗?
看看SamplingProfiler。它不进行“远程”分析,但也不需要开发环境。它只需要能够启动要分析的程序(因此它必须在同一台机器上运行)并且程序必须具有由链接器生成的 .MAP 文件,该文件与 .EXE 位于同一文件夹中。如果这是在内部,那对您来说应该不是问题。
而且,如果您查看帮助文件,您甚至会找到方法让它只分析您程序的某些部分,而 AQTime 无法做到这一点。如果您知道问题出在某个特定位置(例如启动代码),这会有所帮助。
您可以使用我们的开源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
方法(及其自动离开功能),您可以获得所需的所有信息。
通过逐步进行,您将很快找到您的应用程序瓶颈。并且可以根据要求在最终客户方面做同样的事情。
我在几个应用程序上使用了它,并且非常容易地发现了几个瓶颈,甚至在特定的硬件、软件和网络配置上(你永远不知道你的客户使用什么),非常容易。
您还可以尝试我的免费/开源采样分析器: http ://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode
(我使用它比使用 SamplingProfiler 获得更好的结果)它使用各种 Delphi 调试符号(.map、TD32、.jdbg 等)
为什么不在机器上安装 AQTime 并将其用作独立的分析器?不需要“整个 D7 IDE 开发环境”。