2011-01-20 14 views
6

私は290以上のユニットを持つdprを持っています。多くのユニットを持つDelphiプロジェクトには多くの時間がかかります

コンパイルされたexeは50MBです。

DPRのコードは次のようになりました:

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

私は私が「初期化する前に」を参照してくださいする前に8秒で通過していることに気づく建てexeファイルをダブルクリックすると。 exeサイズが大きいためですか?または、この時間を最小限にする方法はありますか?

答えて

4

あなたの質問に基づいて、何でもかまいません。

私が与えることができる唯一のアドバイスは、測定することです:
すべてのユニット初期化セクションのすべてのエントリ/終了のタイムスタンプを記録します。 (それは詳細を説明すると、あなたの質問に追加する必要があります)あなたのコメントの一つに基づいて

WindowsCodecs.dllはおそらく別に一つのフォーマットから1枚のまたは複数の画像を変換し、あなたのユニットのいずれかによって初期化されます。
変換の結果が必要になるまで変換を遅延させる必要があります。

--jeroen

+0

どのコード行でWindowsCodec.dllが呼び出されるのを確認できますか? – LaBracca

+1

それは難しいかもしれません。あなたができることはDelphi Modulesウィンドウにあり、WindowsCodec.dllのロード時にブレークポイントを設定し、ブレークポイント中にスタックを監視します。 –

+5

最後に、AQTime Profilerの試用版をダウンロードしました。この問題はサードパーティのライブラリ初期化コードにあることがわかりました。 – LaBracca

17

アプリケーションの前に。各ユニットの初期化セクションをすべて初期化します。そこに時間がかかるコードがあるかもしれません。

ユニット数は問題ありません。私は1100 +ユニットを持つプロジェクトを持って、exeは35 MBであり、それは即座に始まります。

ネットワークドライブまたは非常に遅いディスクから起動する場合は、速度が低下する可能性があります。

+4

あなたは、プログラムが起動時にそれを(例えばhttp://delphitools.info/samplingprofiler/)プロファイラを貼り付けることによって、その時間を費やしている場所を診断することができるかもしれません。 –

+4

ウイルス対策プログラムによっても発生する可能性があります。 – gabr

+5

クイックヒント:上記のように、アプリケーションの初期化セクションが実行されますが、コンポーネントの初期化セクションも実行されます。私が起動時に見つけた1つの大きな減速(最大60秒の遅延)は、コントロールパネルにインストールしたネットワークプリンタのプロパティを問い合わせしようとしていたプリンタプロパティダイアログのコンポーネントに起因していました。マッピングされていないネットワークドライブやその他のネットワークリソースが応答しないため、コンポーネントの初期化が問題になることがあります。 RAD Studio XEに付属のAQTimeを使用して、アプリケーションのプロファイルを作成します。 –

1

ユニットの初期化セクションは通常、スピードの問題ではありません(データベース関連のものがない限り)。

遅くなる可能性があるのは、リソースからのTFormロードです。 - 「プロジェクト」メニューから「オプション」を選択してから、「フォーム」タブを選択してください。 - TFormをオンザフライで作成することが常に必要です。 - 左のリストの必須ではないフォームをすべて、右の「使用可能な」リストに置きます。 - 要求に応じて、いくつかのコードでフォームを作成します。

ユニットは同じまま:

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

var 
    OneForm: TOneForm; 

しかし、あなたは、リクエストに応じてフォームを作成するには、次のコードを使用することができます。

あなたの元

OneForm.ShowModal; 

は、この種のを使用しての代わりにコード

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

アプリケーションの読み込みがはるかに高速になります。

注: フォームロード前に問題が発生していることを読みました。 このような問題は、上記の方法ではうまくいきません。 私は他人に役立つかもしれないので、私は答えを保持しています。 次回はよく読んでいきます。 :

初期化から多くのコードを実行することは良い設計ではありません リバクタリングは多くのグローバルオブジェクトや変数のように聞こえます。:)

+0

はい、私の問題はAPPLICATION.Initiazlizeの前でもあります。 – LaBracca

1

フォームがたくさんある場合は、フォームを「自動作成」リストから移動し、必要に応じてコードを追加してフォームを作成してみてくださいフォームを作成することさえできます。だから、他の人が言っているように、初期化のセクションが問題です。

のJeroenのブログはこれをデバッグするための素晴らしいリソースで私に指摘:

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

自動作成ステージを形成するまでには8秒かかります。 –

+0

はい私は2つの自動データモジュールを作成していますが、とにかくそのコードは実行されません.Application.Initializeの前に問題があります。 – LaBracca

1

this questionに良い提案がたくさんあります。 。

すぐに起動する必要がないことを絶対に確認してください。これは通常、多くのフォームを持つプロジェクトでの最大の打ち上げ遅延です。

あなたのケースでは、多くの初期化コードが実行されているようです。

関連する問題