2012-04-17 35 views
4

我们有一台内部机器,比起其他任何机器,启动我们的Delphi 7应用程序慢了20倍。使用D7进行远程分析(不是内存分析,但是计时...)

我们希望获得一个性能配置文件(不是内存配置文件)来查找它花费的时间。

我们拥有的AQTime我们发现不会进行远程分析。

我们不想花时间建立一个完整的D7 IDE开发环境,以便我们可以使用AQTime在我们的内部机器上剖析我们的应用程序。

该代码有点太复杂,我们不想自己测量它。

探查器上的任何建议将远程收集高级别(过程或行号)统计信息?

+0

采样分析器不会在我们的情况下工作,因为我们可以肯定的是,延迟发生在TCP/IP协议栈在内心深处,而不是在我们的德尔福单位中的任何一个。 – RobertFrank 2012-04-18 15:31:22

回答

1

为什么不能在机器上安装AQTime,并用它作为一个独立的事件探查器?不需要“整个D7 IDE开发环境”。

+0

只要他们拥有的许可证允许。从版本7开始,它变得相当严格 - 当你在开发机器外面有奇怪的行为时,用于远程分析的模块将受到欢迎。 他们可以尝试免费版,也许它已经足够。 – 2012-04-18 12:22:05

+0

除了最基本的AQTime使用之外,我不太了解它,但我不知道它可以在没有开发环境的情况下使用。 (我们有一个浮动许可证,所以这不是问题。)我需要从我的开发机器(除了.exe)移动到测试机器的文件是什么?感谢您的建议,并提供任何其他信息。 – RobertFrank 2012-04-18 13:43:40

+2

@Robert:你只需要exe。确保它是用调试信息编译的。 IIRC AQTime手册详细解释了这一点。 – Giel 2012-04-18 13:57:31

3

看看SamplingProfiler。它不会执行“远程”分析,但它也不需要开发环境。它只需要能够启动要分析的程序(因此它必须在同一台计算机上运行),并且程序必须在.EXE所在的文件夹中具有由链接程序生成的.MAP文件。如果这是内部的,那对你来说不应该是一个问题。

如果你看看帮助文件,你甚至会想办法让它只能分析程序的某些部分,这是AQTime无法做到的。如果您知道问题出现在某个特定位置(如启动代码),这会有所帮助。

+0

TD32调试信息也很好。 – Thomas 2012-04-18 00:04:06

+0

@Thomas:您可以扩展并发布答案吗? – menjaraz 2012-04-18 03:59:01

+1

@menjaraz:没有什么拓展上,我只是提的是,SamplingProfiler还接受可执行文件中TD32调试节并不仅仅是地图文件,遗憾的用词模棱两可。 – Thomas 2012-04-18 04:08:40

1

您可以使用我们的开放源代码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步骤,你会得到非常迅速给您的应用程序的瓶颈。并且可以根据要求在最终客户方面做同样的事情。

我用这几个应用程序时,发现很容易一些瓶颈,甚至在特定的硬件,软件和网络配置(你永远不知道你的客户使用什么),非常容易。