2013-03-23 10 views
18

最近、5.0を使用してDbContextに4.1を使用してObjectContextからエンティティモデルを移動しました。 DbContextとObjectContextを使用してクエリのパフォーマンスが低下していることに気付いているので、後悔しています。テストシナリオは次のとおりです。DbContextクエリのパフォーマンスが悪いかどうかObjectContext

どちらのコンテキストも、約600個のテーブルで同じデータベースを使用します。 LazyLoadingとProxyCreationは両方ともオフになっています(コード例には表示されていません)。両方とも、事前生成されたビューを持っています。

このテストでは、まずメタデータワークスペースをロードするために1回の呼び出しが行われます。その後、100回実行されるforループでは、コンテキストを新規作成し、最初の10回を呼び出す呼び出しを行います(これはWCFサービスで使用されるため、forループ内にコンテキストを作成しています。コンテキスト毎回)

for (int i = 0; i < 100; i++) 
{ 
    using (MyEntities db = new MyEntities()) 
    { 
     var a = db.MyObject.Take(10).ToList(); 
    } 
} 

これをObjectContextで実行すると、約4.5秒かかります。 DbContextを使用して実行すると、約17秒かかります。 RedGateのパフォーマンスプロファイラを使用してこれをプロファイリングしました。 DbContextの場合、UpdateEntitySetMappingsというメソッドが主な原因です。これはすべてのクエリで呼び出され、メタスペースオブジェクトを取得し、OSpace内のすべてのアイテムを循環するように見えます。 AsNoTrackingは役に立たなかった。

EDIT:問題は、実際のクエリではなく、DbSetとObjectSetの作成\初期化と関係しています。 ObjectContextを使って呼び出しを行うと、ObjectSetを作成するのに平均42msかかる。 DbContextでコールすると、内部dbsetを作成するのに約140msかかります。 ObjectSetとDbSetの両方は、メタデータワークスペースからエンティティセットのマッピングルックアップを行います。私が気づいたのは、DbSetは、ObjectSetが動作していない間は、ワークスペース内のすべての型に対してDbSetを実行するということです。私は、パフォーマンスの差が少ない表が少ないモデルを推測している(試していない)。

答えて

2

DbContextは、ObjectContextのラッパーです。あなたの質問については、ここでは良いanswerです。パフォーマンスを犠牲にして使いやすくすることは可能です。

4

Iはまた、コードの最初のアプローチの業績不振を懸念してきたとDbContextであるので、私は、結果は全く驚きではなかったあなた

http://netpl.blogspot.com/2013/05/yet-another-orm-micro-benchmark-part-23_15.html

と同様のシナリオで、いくつかのベンチマークを実行しましたObjectContext上のラッパーですが、単純さのためにパフォーマンスを犠牲にしなければなりません。あなたはあまりを取得するより多くのレコードが違い

  • は、あなたがそれはあなたが
  • 速くなりたい場合は追跡をオフにすることでより重要なを取得する複数のレコードである

    • :しかし、私のテストがあることを示しますコードは最初のものより有意に遅いことわずか10レコード

      enter image description here

      注意を取得例えば

      、最初はモデルであり、追跡と追跡なしの間に顕著な違いはありません - 両方の観察はまったくあなたのものと同じです。10000行を取得するとき

      しかし、あなたは最初notrackingバージョンの最初のコードとモデルの間にほとんど差がないことが

      enter image description here

      注意を持っています。また、両方ともraw ado.netデータウェアーとほぼ同じくらい速く、驚くほど優れたパフォーマンスを発揮します。

      詳細については、私のブログのエントリをフォローしてください。

      この単純なベンチマークは、コードの性質を最初に受け入れるのに役立ちました。私はまだポコエンティティとマイグレーションという2つの機能のために、より小さなプロジェクトでもそれを好んでいます。一方、私はパフォーマンスが重要な要件であるプロジェクトのために2つのうちのどれかを選ぶことはありません。これは、おそらくモデルの最初のアプローチをもう一度使用することはないだろうという意味です。

      (サイドノート:私のベンチマークもNHibernateはと間違って何かがあることが明らかになった私はまだ誰もが、私は毎日NHを使用する2つの独立した開発者に相談したにも関わらず、これを説明するために私を助けるために発見していない)

    関連する問題