2012-09-25 7 views
20

私の同僚はこの質問を昨日投稿しました:7-second EF startup time even for tiny DbContextエンティティフレームワークのスピンアップは、x64とx86の両方ではるかに遅い

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

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

これを考慮すると、Entity Frameworkは、64ビットシステムと32ビットシステムをターゲットとする場合、はるかに異なる初期化プロセスを実行しているようです。これを説明するために何が起こっているのか誰にも洞察がありますか?

+0

おそらくアセンブリプロービングですか?あなたはそれについての簡単なチェックとしてFusion Logを見ることができます。 –

+0

@CraigStuntz融合ログを確認したが、x86とx64の違いは何も見えなかった。 – Sidawy

+1

これは面白いです。 FYI EFには、32ビットまたは64ビットアーキテクチャ固有のコードはありません。純粋なILです。それでも差は大きいです。 – Pawel

答えて

11

問題は完全に再現可能です。私はちょうどそれを実行し、x86およびx64の両方の実行のスナップショットを収集するためにdotTrace Performanceプロファイラを使用しました。私はあなたが報告したのとほとんど同じ時間を得ました。しかし、x64とx86トレースの間には明らかな違いはありません.x64はx86の2倍以上の時間を要します。

しかし、これはNUnitテスト実行のトレースでした。ただ、コンソールアプリケーションと同じテストを実行することで、私はこのような時代を得る:

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

それは、はるかに優れていないことになりますか? x86とx64の間にはまだ違いがありますが、一部の操作ではx64コードの方が一般に遅くなる可能性があります。

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

編集:

もう少しテストを行いました。 NUnitとResharperの両方のタスクランナーはこの問題を抱えていますが、最初のテストにのみ影響します。他のすべてのテストはすぐに実行されます。 xUnitは同じ動作を示します。

+2

彼らの言うことを知っている..."ビットを2倍にして、楽しみを倍増させてください!"あ、ちょっと待って。それは正しくありません。 – BoltClock

+0

非常に興味深い。私は同じトレースを実行し、同じ動作を見た。 NunitランナーとEFの間の相互作用がなぜx64のランタイムを増加させるのかという疑問がある。 – Sidawy

関連する問題