我们有一台内部机器,比起其他任何机器,启动我们的Delphi 7应用程序慢了20倍。使用D7进行远程分析(不是内存分析,但是计时...)
我们希望获得一个性能配置文件(不是内存配置文件)来查找它花费的时间。
我们拥有的AQTime我们发现不会进行远程分析。
我们不想花时间建立一个完整的D7 IDE开发环境,以便我们可以使用AQTime在我们的内部机器上剖析我们的应用程序。
该代码有点太复杂,我们不想自己测量它。
探查器上的任何建议将远程收集高级别(过程或行号)统计信息?
我们有一台内部机器,比起其他任何机器,启动我们的Delphi 7应用程序慢了20倍。使用D7进行远程分析(不是内存分析,但是计时...)
我们希望获得一个性能配置文件(不是内存配置文件)来查找它花费的时间。
我们拥有的AQTime我们发现不会进行远程分析。
我们不想花时间建立一个完整的D7 IDE开发环境,以便我们可以使用AQTime在我们的内部机器上剖析我们的应用程序。
该代码有点太复杂,我们不想自己测量它。
探查器上的任何建议将远程收集高级别(过程或行号)统计信息?
为什么不能在机器上安装AQTime,并用它作为一个独立的事件探查器?不需要“整个D7 IDE开发环境”。
只要他们拥有的许可证允许。从版本7开始,它变得相当严格 - 当你在开发机器外面有奇怪的行为时,用于远程分析的模块将受到欢迎。 他们可以尝试免费版,也许它已经足够。 – 2012-04-18 12:22:05
除了最基本的AQTime使用之外,我不太了解它,但我不知道它可以在没有开发环境的情况下使用。 (我们有一个浮动许可证,所以这不是问题。)我需要从我的开发机器(除了.exe)移动到测试机器的文件是什么?感谢您的建议,并提供任何其他信息。 – RobertFrank 2012-04-18 13:43:40
@Robert:你只需要exe。确保它是用调试信息编译的。 IIRC AQTime手册详细解释了这一点。 – Giel 2012-04-18 13:57:31
看看SamplingProfiler。它不会执行“远程”分析,但它也不需要开发环境。它只需要能够启动要分析的程序(因此它必须在同一台计算机上运行),并且程序必须在.EXE所在的文件夹中具有由链接程序生成的.MAP文件。如果这是内部的,那对你来说不应该是一个问题。
如果你看看帮助文件,你甚至会想办法让它只能分析程序的某些部分,这是AQTime无法做到的。如果您知道问题出现在某个特定位置(如启动代码),这会有所帮助。
您可以使用我们的开放源代码TSynLog
class将分析添加到任何应用程序,而不仅仅是在开发人员计算机上。
它不是一个自动化的分析器,和其他工具一样:你必须修改你的代码。但它可以根据要求远程运行,甚至在没有任何通信的情况下也可以运行,即使是最终客户方也是如此。
您添加了一些分析调用某些方法代码,然后进入和离开方法将被记录到一个文本文件。然后,supplied log viewer可用,并有一些专门的方法来执行分析,并确定慢速方法。
Profiling methods from log http://blog.synopse.info/public/LogView01.png
日志机制可以用来跟踪递归调用。它可以使用基于接口的机制来记录当你进入和离开的任何方法:
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
方法(及其自动离开功能),您可以获得所需的全部信息。
通过分步procedding步骤,你会得到非常迅速给您的应用程序的瓶颈。并且可以根据要求在最终客户方面做同样的事情。
我用这几个应用程序时,发现很容易一些瓶颈,甚至在特定的硬件,软件和网络配置(你永远不知道你的客户使用什么),非常容易。
您也可以尝试我的自由/开源采样分析器: http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode
(我得到更好的结果比用SamplingProfiler) 它使用各种德尔福的调试符号(.MAP,TD32,.jdbg等)
采样分析器不会在我们的情况下工作,因为我们可以肯定的是,延迟发生在TCP/IP协议栈在内心深处,而不是在我们的德尔福单位中的任何一个。 – RobertFrank 2012-04-18 15:31:22