8

VB .NET 4.0 / VS2010 で記述された .NET アプリを取得し、すべてのプロジェクトをデバッグ構成とリリース構成の両方で AnyCPU 設定に設定してコンパイルしました。このアプリを 64 ビット環境 (Windows Server 2003 R2 および 2008 R2 でテスト済み) で実行すると、約 6 ~ 12 秒ではなく、少なくとも 2 倍の時間がかかる (絶対値で約 25 秒) ことに気付きました。 32 ビット環境 (Win XP および 7) で数秒で起動します。

64 ビット システムは強力なサーバーであり、テスト済みの他の 32 ビット システムよりも確実に強力であることを付け加えておきます。他のすべてのアプリは 64 ビットでより高速でしたが、私たちの貧弱なアプリではそうではありませんでした;) (また、さまざまな時間、さまざまな負荷の下でアプリをテストしましたが、結果は常にほぼ同じです。)

上記のように、アプリは AnyCPU を使用して構築されており、64 ビット OS で 64 ビット アセンブリとして実行されます (TaskManager で確認)。アプリ自体は WinForms アプリであり、NetAdvantage Forms v10.3 を利用しており、MS SQL Server 2008 に対して定期的にクエリと書き込みを行っています。

さまざまなターゲット マシンがすべて同じネットワーク上にあるため、たとえばデータベースへのパス (パフォーマンス テストには同じデータベースが使用されました) は同じです。問題はデータベースやネットワーク自体にあるとは思いません。

私には奇妙に思えましたが、MainForm の起動時にストップウォッチを使用してさまざまな「プロファイリング手順」を組み込んだときに、64 ビットでは InitializeComponent メソッドに 2 倍の時間がかかり、1.5 秒に対して約 4 秒かかることに気付きました。 32ビットで。

これは、両方のシステムに展開するまったく同じアプリであり、異なる構成はありません。

だから私は2つの質問があります:

これの原因は何でしょうか?

そして:「問題のある」コードを特定する最善の方法は何ですか? 現在、私はストップウォッチを使用して、それを絞り込もうとしています。しかし、私たちのアプリに関する限り、64ビットマシンではすべてが遅いように見えるので、特定のステートメントに分解できるかどうかはあまりわかりません.

ご協力いただきありがとうございます。

4

3 に答える 3

4

AnyCPU から特に x86 にコンパイルを切り替えるとすぐに、つまり x64 ビット プラットフォームで x86 として実行するとすぐに、「良好な速度」に戻ったことが判明しました。

于 2012-11-20T03:02:05.280 に答える
4

同じ問題がありました-はい、JITのせいです。msgbox を慎重に使用することで、開始に 10 秒かかるメソッドに絞り込みました(大きなメソッドを呼び出す直前にメッセージ ボックスを呼び出し、次に大きな関数の最初の行として)。 AnyCPU としてコンパイルしますが、明示的に x86 の場合はコンパイルしません。デバッグで実行しているときではありません。

私の場合、それは 5000 行の Windows FormsInitializeComponentでした。

これを証明するにc:\windows\<.net framework dir>\ngen.exe install <myassembly.exe>は、ネイティブ イメージをコンパイルする (昇格した) " " を実行します。これで問題が解決する場合、はい、JIT のせいです。

長期的な修正、次のいずれか:

  • プログラムをデプロイするたびに ngen を使用してネイティブ イメージを再構築します (または ngen update を使用して再構築しますが、明らかに一度だけインストールすると機能します)。(欠点は、ngen イメージの管理と ngen にかかる時間です。これは、より大きなアプリケーションの全体的なパフォーマンスが向上するため、私が取ったルートです。)

  • <System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoOptimization)>または、属性をメソッドに追加できます。(メソッドで JIT を無効にするため、実行遅くなりますが、私たちにとって高価な部分である JITing の初期オーバーヘッドを支払う必要はありません)

(両方を行うことは、大規模なメソッドのネイティブ イメージを放棄することを意味するため、無益であると思われます。)

于 2014-12-09T20:40:00.697 に答える