5

.NET Framework 2.0 を対象として、単純な Windows フォーム実行可能ファイルを C# で作成しました (単純に言えば、約 20 個のメソッドがありますが、ウィンドウは 1 つだけです)。InitializeComponent();アプリケーションがロードされると、コンストラクターのデフォルト以外のことは何もしません。

Windows 8 を初めて開いたとき、ここでアプリケーションを読み込むのに約 7 秒かかりました。その後、次に開くときに1秒もかかりません。

私が試した Windows XP では、初回のロードに約 30 秒かかります。私の友人の何人かは、アプリケーションをテストするときに、最初の読み込みに時間がかかる (これも約 30 秒) と不満を漏らしています。その後、より速く(1または2秒)かかります。

これは、.NET Framework がまだロードされていないことが原因であると考えられるため、マシンにロードするのに時間がかかります。

.NET アプリケーションで同じ問題を経験したことがありますか?
なぜこれが起こるのか、どうすれば修正できますか?

編集 - 一部の人々がNGENを提案しているようです。ただし、アプリケーションを使用するすべてのマシンでこれを行う必要がある場合、これは解決策にはなりません。自分のアプリケーションを「一般ユーザー」の大衆にリリースしたいのですが、自分のアプリケーションを使用するために追加の作業を彼らに要求しても意味がありません。.NET Framework が必要になるだけでも十分です。私のアプリケーションは、依存関係のないスタンドアロン EXE のみにする必要があります (フレームワークを除く)。

ありがとうございました。

4

3 に答える 3

6

アプリケーションの読み込み時に .NET が使用する NGEN を使用して、ネイティブ イメージの事前生成を試すことができます。

詳細については、http://msdn.microsoft.com/en-GB/library/6t9t5wcf(v= vs.80 ).aspx を参照してください。

これらはプラットフォームに依存し、通常は転送できないため、展開する各マシンでこれを行う必要があります。

于 2013-03-26T23:38:12.067 に答える
5

これは、CIL の Just-In-Time コンパイルが原因である可能性が最も高いです。NGenを使用して、実行している環境用にコードをコンパイルできます。ただし、このルートをたどると、.Net のプラットフォームに依存しない性質が失われる可能性が高くなります。

MSDN のこのブログ エントリでは、NGen のパフォーマンス上の利点について詳しく説明しています。一読することをお勧めします。

次のコメントを更新

Lloyd が彼の回答で指摘しているように、ユーザーにインストーラーを提供すると、この時点で、アプリケーションがインストールされている環境で NGen を実行できます。

ただし、NGen を使用できない場合は、プロファイラーをアタッチしてアプリケーションを起動することをお勧めします。コード内のパフォーマンスのボトルネックを浮き彫りにすることができます。シングルトンまたは高価な静的初期化子がある場合、これらは強調表示され、リファクタリングする機会が与えられます。

多くの優れた .Net プロファイラーがあります (詳細については、この SO の質問を参照してください)。個人的には、dotTraceを確認することをお勧めします。また、アプリケーションに必要な 1 か月間の無料試用期間も提供しています。

于 2013-03-26T23:37:57.217 に答える
0

[...] .NET Framework 2.0 を対象としています。アプリケーションがロードされると、デフォルトの InitializeComponent(); 以外は何もしません。コンストラクターで。

実際にはそうではありません。アプリケーションは、型の読み込み、静的コンストラクターの初期化なども行います。

ほとんどの場合、パフォーマンスの問題が発生した場合は、単純にプロファイラーを使用します...多くのことが進行している可能性があり、プロファイラーは洞察を得る最も簡単な方法です。利用可能ないくつかの異なるオプションがあります。個人的に、私は Red-Gate のプロファイラーのファンで、試用版があります。

これが行われる方法が .NET Framework で変更されたことは注目に値します。2.0 で必要なパフォーマンスが得られない場合は、別のフレームワークを試すだけです。確かに、Windows XP は小さな問題かもしれません...

于 2013-03-27T22:09:20.970 に答える