21

私の同僚は昨日この質問を投稿しました:小さなDbContextでも7秒のEF起動時間

彼のコードを取得し、それを可能な限り分離するために別のソリューションに移動した後、含まれているプロジェクトのプラットフォームターゲットがEFスタートアッププロセスの実行時間に大きな影響を与えていることがわかりました。

x64をターゲットにした場合、最初のDbContextをスピンアップするのに約7秒かかり、2番目のDbContextをスピンアップするのに1秒未満かかることがわかりました(x64もターゲットにしている同僚の調査結果と一致しています)。ただし、プラットフォームターゲットをx86に切り替えた場合、最初のDbContextのスピンアップ時間は約4秒短縮されて3.34633秒になり、2番目のDbContextはx64の場合と同じ時間がかかりました。

これを考えると、64ビットシステムと32ビットシステムを対象とする場合、EntityFrameworkは非常に異なる初期化プロセスを実行しているように見えます。誰かがこれを説明するために内部で何が起こっているのかについて何か洞察を持っていますか?

4

1 に答える 1

11

問題は完全に再現可能です。私はそれを実行し、dotTrace Performance Profilerを使用して、x86とx64の両方の実行のスナップショットを収集しました。私はあなたが報告するのとほとんど同じ時間を得ました。ただし、x64トレースとx86トレースの間に明らかな違いはありません。ただし、x64はどこでもx86の少なくとも2倍の時間を要します。

しかし、それはNUnitテスト実行のトレースでした。コンソールアプリケーションと同じテストを実行すると、次のような時間が得られます。

x86: 0,6864012, 0,0468001
x64: 1,0608019, 0,0468001

それはずっと良く見えますね?x86とx64の間にはまだ違いがありますが、x64コードは、一部の操作では一般に遅くなる可能性があります。

この時点での問題はEFではなく、NUnitとそのテストランナーに関するものです。

編集:

さらにテストを行いました。NUnitとResharperの両方のタスクランナーにこの問題がありますが、最初のテストにのみ影響します。他のすべてのテストはすばやく実行されます。xUnitは同じ動作を示します。

于 2012-09-25T17:55:57.593 に答える