2011-01-20 14 views
6

我有一個dpr與290+單位。與許多單位的德爾菲項目需要很多運行

編譯的exe是50MB。

朝鮮民主主義人民共和國代碼是現在這個樣子:

begin 
    ShowMessage('Before Initialize'); 
    Application.Initialize; 

當我雙擊內置exe文件,我注意到有8秒後我纔看到「初始化之前」。這是因爲exe文件很大嗎?或者有什麼方法可以最小化這個時間?

回答

4

根據你的問題,它可以是任何東西。

我可以給你的唯一建議是測量:
記錄所有單元初始化部分中每個入口/出口的時間戳。

根據您的意見一個(你應該添加到您的問題,因爲它描述更詳細):

WindowsCodecs.dll是由您的單位之一初始化,可能是從一種格式轉換一個或多個圖像到另一個。
您應該延遲轉換,直到需要轉換的結果爲止。

--jeroen

17

Before Application.Initialize執行每個單元的每個初始化部分。你可能有一些需要時間的代碼。

單位數量不是問題。我有一個1100多個單元的項目,EXE是35 MB,它瞬間啓動。

如果您從網絡驅動器或真正緩慢的磁盤開始,則可能會出現放緩現象。

+4

您可以診斷該程序被啓動時它堅持一個分析器(例如http://delphitools.info/samplingprofiler/)消耗時間。 – 2011-01-20 12:49:16

+4

也可能由防病毒程序引起。 – gabr 2011-01-20 13:37:53

+5

快速提示:如上所述,執行應用程序中的初始化部分,同時執行組件的初始化部分。我在啓動時發現的一個大的放緩(最多延遲60秒)是由於打印機屬性對話框組件試圖查詢我在控制面板中安裝的網絡打印機的屬性,而這些屬性沒有響應。映射的網絡驅動器和其他未響應的網絡資源以及組件初始化可能是一個問題區域。使用RAD Studio XE附帶的AQTime來分析您的應用。 – 2011-01-20 14:19:36

1

單元的初始化部分通常不是速度問題(除非你有一些數據庫相關的東西)。

什麼是緩慢的TForm加載資源。

只有在需要時纔會創建TForm: - 轉到「Project」菜單,然後選擇「Options」,然後選擇「Forms」選項卡。 - 將左列表中的所有非強制性表單都放在右側的「可用」列表中。 - 通過一些代碼按要求創建表單。

單位仍然是相同的:

type 
    TOneForm = class(TForm) 
    .... 
    end; 

var 
    OneForm: TOneForm; 

但是你可以用下面的代碼來創建要求的形式:

而不是你以前

OneForm.ShowModal; 

使用這種代碼

if OneForm=nil then 
    OneForm := TOneForm.Create(Application); 
    OneForm.ShowModal; 

您會發現應用程序的加載速度要快得多。

注意: 我剛剛讀到的問題是在表單加載之前。 因此,上述技巧不適用於這個特殊問題。 我保留答案,因爲它可能對其他人有用。 下次我會讀得更好。 :(

在所有情況下,從初始化運行很多代碼是不是一個好設計 聽起來像很多全局對象或變量......重構可能在這裏有意義... :)

1

您已經知道如果您有很多表單,請嘗試將表單移出「自動創建」列表,然後添加代碼,以便在需要時創建表單,但在您面前發現此問題甚至可以創建一個表單。正如其他人所說,初始化部分是問題所在。

吉榮的博客中指出我在一個巨大的資源用於調試這樣的:

http://wiert.wordpress.com/2010/07/21/delphi-great-post-by-malcolm-groves-about-debugging-initialization-and-finalization-sections/

他向我指出馬爾科姆格羅夫斯:

http://www.malcolmgroves.com/blog/?p=649

1

有很多很好的建議,this question

你應該絕對確保你沒有在啓動時創建你不需要的東西。這通常是有很多形式的項目的最大推遲延遲。

在你的情況,聽起來像很多初始化代碼正在執行。