2011-11-12 3 views
5

問題の範囲:私が知り、信頼するデータアクセスブロックEnterprise Libraryの速度と信頼性にトレードオフをかけずにEF4.1を使用したいと考えています。エンティティフレームワーク4.1対エンタープライズデータアプリケーションブロック最大パフォーマンス

EFパフォーマンスチューニングについての多くのStackoverflowリンクとブログのおかげで、ADO/Enterprise Libデータアクセスブロック(SqlDataReader)のパフォーマンスに一致するEF4.1を使用する方法が多く投稿されています。

プロジェクト: 1.エンティティ/ダイナミックSQLにlinqはありません。私はlinqが大好きです、私はオブジェクトに対して主にそれを使用しようとします。 2. 100%のストアドプロシージャとトラッキングなし、マージなし、そして最も重要なのは、.SaveChanges()を決して呼び出さないことです。私はちょうど挿入/更新/削除proc DbContext.StoredProcName(params)を呼び出します。この時点で、EFのいくつかの迅速な開発要素が削除されましたが、ストアドプロシージャの複雑な型を自動的に作成する方法で十分です。

SqlTable Row Count The Class The Mapper GetStringメソッドと同様の方法だけで期待の種類を通過し、型にDataReaderをキャストAbstractMapperあります。 The Sproc Enterprise Lib result

だから、これは私に関する限りビートに目印です。私が知っているより遅いものを採用するのは難しいでしょう。

EF result one

遅い

!ずっと遅い!より多くのそれのようである

EF Result TWO

!! 私の結果によると、パフォーマンスパイはトラッキングオーバーヘッドを1%以上増加させるはずです 私はビューをあらかじめコンパイルしようとしましたが、トラッキングなしのブーストは得られませんでした!なぜ??たぶん誰かがそれにチャイムできる。

これはEnterprise Libと比較するのが面倒ではありませんが、IISアプリケーションプールごとに一度読み込まれるメタデータを読み込むために、データベースに時間切れの呼び出しを1つ作成しています。本質的にあなたのアプリの生活の中で一度。

EF result Three

私は自動ストアドプロシージャの作成とEFをこのようを使用していると私は、これらすべてのEDMX機能ノードは、エンティティまでマッピングするために自動インポートにEdmxへのLINQを使用。次に、各エンティティとエンジンのリポジトリを自動生成します。

私は決してSaveChangesを呼び出すことはないので、デザイナーに保存されたprocsにマップする時間はかかりません。時間がかかり過ぎて、簡単にそれを壊して、それを知らない方法です。だから私は文脈からprocsを呼び出す。

これを私の新しいミッションクリティカルな医療機器配信Webアプリケーションに実際に実装する前に、私は観察と批評を感謝します。

ありがとうございます!

+0

私は今、数ヶ月のためにこれを使用していると、それは偉大な作業が、1つの事のためです。 EFはソースコントロールでも、マージフレンドリでもありません。 EFについてのフェンスがあれば、パフォーマンスは重要な問題ではないと信じています.EFは.edmx全体を更新し、.edmxファイルにダイアグラムxyの場所を保存します。同じ変更されていないXMLノードが2つの異なる開発者から数千の行を離れていることに気づいた。コードスミスはこの問題をPlinqOで解決し、MSもそうするべきです。 – TheDev6

答えて

5

ちょうど少数の発言:

Performance Pie私の結果に基づいて、パフォーマンスのパイが たくさんの1%以上で追跡オーバーヘッドを増やすべきだと私は、ビューをコンパイルする前 を試してみましたが、何ものように大きな得ませんでしたトラッキングなしでブースト! なぜですか?

ブログ投稿は2008年のものであり、EFバージョン1とEntityObject派生エンティティに基づいています。 EF 4.1ではPOCOを使用しています。チェンジトラッキングはPOCOとは非常に異なる動作をします。特に、POCOオブジェクトがデータベースからオブジェクトコンテキストに読み込まれると、Entity Frameworkによって元のプロパティ値のスナップショットが作成され、ストアはコンテキストに格納されます。変更トラッキングは、現在のエンティティ値と元のスナップショット値との比較に依存します。このスナップショットを作成することは、パフォーマンスとメモリ消費量の面でも明らかに高価です。私の見解では、少なくとも50%のコストがかかります(クエリ時間変更トラッキングなし)。クエリ時間の半分はで、変更追跡はです。あなたはさらに大きな影響を測定したようです。

プロジェクト:1.エンティティ/ダイナミックSQLにlinqはありません。私はlinqを愛する、私はちょうど オブジェクトに対してそれを使用しようとするほとんど。 2. 100%のストアドプロシージャで、追跡もマージもなし、最も重要なのは.SaveChanges()を決して呼び出さないことです。 I DbContext.StoredProcName(params)のinsert/update/deleteプロック を呼び出してください。この時点では、 のいくつかのEFの素早い開発要素が排除されましたが、それは自動的に 複雑なタイプのストアドプロシージャを作成する方法で十分です。

これは、Entity Frameworkが存在する主な機能のいくつかを本質的に無視しているように見えます。なぜ、あなたの目的にEFを使用したいのか疑問です。あなたの主な目的がクエリ結果を複雑なオブジェクトに具体化するのに役立つツールを持っているなら、高性能を念頭に置いてこのタスクに焦点を当てたDapperを見ることができます。 (DapperはStackoverflowで使用されているORMです)

ここ数日前に、EFのパフォーマンスについて大きな疑問がありました。今まで「プログラマ」に移行されています:

https://softwareengineering.stackexchange.com/questions/117357/is-entity-framework-suitable-for-high-traffic-websites

+0

素晴らしい情報!あなたの投稿をありがとう。私はそれをすべて見ている。 DBからのダイナミクスを返す簡単な経験は、プロパティをタイプミスしたときにコンパイル時にアプリケーションが中断しないようにしていました。強く型付けされたオブジェクトを抽出すると、ダブルマッピングのように感じられました。私はDapperとMassiveを再訪すべきです。私はエンタープライズ用の自動コードジェネレーションを書くかもしれません。再び、素晴らしい情報!どうも。 – TheDev6

関連する問題