我們有一臺內部機器,比起其他任何機器,啓動我們的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