2008-12-15 254 views
21

我的Delphi 2006應用程序出現一些性能問題。 你可以提出任何分析工具,將幫助我找到瓶頸Delphi分析工具

即像渦輪探查的工具

+0

http://www.prodelphi.de/ – Ampere 2018-02-26 10:33:43

+0

這是免費的,易於使用(與ProDelphi相比)。 delphitools.info/downloads/samplingprofiler-changelog – Ampere 2018-02-26 11:50:57

回答

24

我問了同樣的question不久前

我已經下載並嘗試AQtime。它看起來很全面,但它不是一個易於使用的工具,對單個程序員而言非常昂貴(即600美元)。我喜歡它是非侵入式的(不會改變您的代碼),並且它可以逐行進行分析,直到我發現它是一個儀表分析器,它可能會導致不正確的優化,如下所示: Why is CharInSet faster than Case statement?

我嘗試了一個ProDelphi的演示,價格便宜得多(我想大概80美元),但是對我來說太笨了 - 我根本不喜歡用戶界面,而且它是侵入性的 - 更改代碼添加儀器,你必須小心。

我在Delphi 4中使用了GpProfile多年。我愛它。它也是侵入性的,但它工作得很好,我學會了相信它,它在10年內從未給我帶來過問題。但是,當我升級到德爾福2009年時,我認爲最好不要嘗試使用它,因爲它尚未升級,並且由GP承認,如果不進行修改,將無法正常工作。我希望你不能在Delphi 2006中使用它。

ProDelphi和GpProfile只會在過程級別進行配置。如果你想做獨立的行(我有時必須),你必須爲每行調用PROC1,PROC2,PROC3,並在每個PROC中放入一行。這樣做有點令人煩惱,但它給了我很好的結果(至少我對GpProfile的結果感到滿意)。

我在我的CharInSet問題中接受的答案表示:「採樣分析器定期檢查CPU的位置,通常更適合測量代碼時間。」和後來的answer給了Eric的Grange免費的Delphi採樣分析器,它現在支持Delphi 2009。我還沒有嘗試過,但我聽說過它的好處,而且它將是我要嘗試的下一個。順便說一句,您可能最好通過不購買AQtime來節省您的600美元,而是使用它來將您的Delphi 2006升級到Delphi 2009。穩定性,速度和額外功能(特別是Unicode)將是值得的你的時間。請參閱:What are major incentives to upgrade to D2009 (Unicode excluded)?

此外,AQtime還未集成到Delphi 2009中。

另一個免費的,有我發現了,但還沒有嘗試過的來源是TProfiler。如果有人試過那個,我想知道他們在想什麼。


注:Addenum後來我加入question 291631好像它可能是答案。見Andre's open source program: asmprofiler


2010年2月跟進。我咬緊牙關,購買了AQTime。幾個月前,他們終於把它整合到我使用的Delphi 2009中(但他們仍然需要做Delphi 2010)。查看源代碼行以及它們的個人時間和次數對我來說是非常寶貴的,AQTime在這方面做得非常出色。

3

www.AutomatedQA.com已經德爾福分析(AQTime)的最佳選擇

+2

請注意,AQA基於儀器而不是分析,因此它會給出非常細粒度瓶頸的誤導性結果。 – 2008-12-16 01:54:11

+0

s/not profiling/not sampling/ – 2008-12-16 01:55:15

-1

最後一點,www.torry.net是GRE在Delphi組件/工具搜索的地方

+7

Darian,而不是對一個問題添加4個答案,編輯您的第一個答案以提供所有信息,並刪除其他3. – 2008-12-18 06:14:39

5

我已經使用http://www.prodelphi.de在過去的Delphi 7項目上取得成功。便宜和作品。不要讓布什聯盟網站嚇跑你。

3

我使用和推薦Sampling Profiler,我認爲你可以從embarcadeiro.public,附件新聞組得到它。

+0

現在它位於http://delphitools.info/上 – 2009-03-21 08:47:34

11

我剛剛發現了一個很不錯的免費sampling profiler,它支持Delphi 2009年

8

我用ProDelphi,主要是爲了確定哪些程序正在吃飯的時間最多。它是一個Instrumenting Profiler,意味着它在每個程序的開始和結束時添加了一些代碼。您可以通過註釋中的指令來控制它配置哪些例程。您還可以剖析例程的各個部分。但是這些部分必須在相同的塊級開始和停止,不要進入或退出該部分。在ProDelphi插入代碼(放置指令的位置)的地方,優化必須關閉,但您可以在任何其他位置打開它。

界面是有點klunky,但非常快,一旦你得到它的竅門。您可以使用免費版本進行有用的工作(限於10個例程或部分)。 ProDelphi可以快速告訴你應該檢查哪些例程。但不是爲什麼,或者哪一行。

最近,我已經開始使用英特爾的VTune性能分析器。 'WOW'並沒有開始總結。我留下深刻的印象。我根本不知道這些內置於現代英特爾處理器中。您是否知道它可以準確地告訴您單個指令需要等待L1數據高速緩存在另一個內核中橫向查看的頻率,然後才能從更高的緩存中重新載入單詞?如果我一直在寫作,那麼聽起來就像是產品的廣告。

前往英特爾下載全功能定時演示。在網上挖掘並找到一些關於如何開始的視頻。 (否則,你會冒着被所有選項阻礙的風險。)它適用於任何編譯器。只需將其指向一個.exe即可。它會告訴你源代碼行,如果你的.exe包含調試信息&你指向它的源代碼。


我被卡在試圖優化一個內部循環,調用我寫的函數。除了長度(str)以外,沒有外部呼叫。這個內部循環每次運行數十億次,並且耗費大約一半的CPU時間 - 這是優化的最佳選擇。我嘗試了各種標準優化,幾乎沒有效果。 VTune顯示熱點。我只是鑽了下去,直到它向我展示了我生成的ASM代碼以及每條指令花費了多少時間。

這裏就是VTune™可視化告訴我:

  • 線NNNN [Delphi的代碼行] ...
  • 地址HHHH CMP字節的ptr [EDX + ECX],0x14h - - - - - - - - 3個週期
  • 地址HHHH JA LABEL_X - - - - - - - - - - - - - - - - - - -10302週期

絕對值沒有意義。 (我認爲我正在測量退役的每個指令的循環次數。)相對值可以清楚地表明所有時間都在哪裏。建議窗口是偉大的事情。它告訴我,代碼停滯不前,等待數據加載到L1數據緩存中,並且就如何避免失速給我提供了很好的建議。

我的錯誤在於將Core2 Quad視爲一款非常快速的8086 CPU。沒有^ 3。代碼花費了99%的時間等待數據從內存中加載,因爲我跳得太多了。我的算法假定內存是RAM(隨機訪問)。這不是現代CPU的工作原理。 L1緩存中的數據可能會在1或2個週期內訪問,但訪問L2或L3緩存需要花費數十到數百個週期,而使用RAM需要花費數千個週期。 但是,當您按順序訪問您的數據時,所有的延遲都會被避免 - 因爲處理器將在您要求的第一個字節之後用數據預加載緩存。最終的結果是我重寫了算法以更順序地訪問數據,並獲得了10倍加速,這已經足夠好了。當我有時間的時候,我確信我可以得到另外的10倍。但那只是我的極客。好夠夠好。

我已經知道你通過優化算法而不是你的代碼獲得最大的回報。我以爲我只需要分析器就能告訴我需要優化哪些東西。但我也需要它來找出瓶頸的原因,所以我可以設計一個更快的算法。

新算法與舊的算法沒有根本的不同。它只是存儲數據,以便可以順序訪問。例如,在一個地方,我將一個記錄數組中的字段移動到它自己的整數數組中 - 因爲內部循環不需要每條記錄中的其餘數據。我也有一個矩形矩陣存儲爲動態數組的動態數組。代碼使用這個來隨機訪問兆字節的數據(而糟糕的L1數據緩存只有64Kb)。我想出瞭如何將它作爲矩陣的對角線存儲在線性陣列中,這是我使用數據的順序。 (好吧,也許這部分激進。)

無論如何,我在VTune出售。