私は WCF Data Services を初めて使用するので、遊んでいます。いくつかの初期テストの後、テスト データ サービスのパフォーマンスにがっかりしました。
WCF DS は HTTP ベースであるため、プロトコルに固有のオーバーヘッドがあることを認識していますが、私のテストは予想よりもはるかに遅いです。
環境:
- すべてが 1 つのボックスに: W7 を実行する 4GB RAM のクアッド コア 64 ビット ラップトップ。まともなマシン。
- 16 個のテーブルを持つ小規模な SQL データベース (SQLExpress 2008 R2)... テスト対象のテーブルには 243 行あります。
- すべてのデフォルトを使用して IIS でテスト サービスをホストしました。
コード:
- このデータベースの Entity Framework モデル (DataContext) を作成しました (VS2010 によるストック コード生成)。
- このモデルに基づいてデータ サービスを作成しました。
- このサービスの直接サービス参照 (ObjectContext) を持つクライアントを作成しました (VS2010 によるストック codegen)
- クライアントでは、EF モデルを直接呼び出したり、ネイティブ SQL (ADO.NET SqlConnection) を使用したりすることもできます。
テスト計画:
- 各反復はデータベースに接続し (接続を再利用するオプションがあります)、ターゲット テーブル (「EVENTS」) 内のすべての行をクエリし、それらをカウントします (したがって、遅延フェッチが実行されます)。
- ネイティブ SQL (SqlConnection/SqlCommand)、Entity Framework (DataContext)、および WCF Data Services (ObjectContext) に対してそれぞれ 25 回の反復を実行します。
結果:
- ネイティブ SQL の 25 回の反復: 436 ミリ秒
- Entity Framework の 25 回の反復: 656 ミリ秒
- WCF データ サービスの 25 回の反復: 12110 ミリ秒
ああ。これは、EF よりも約 20 倍遅いです。
WCF Data Services は HTTP であるため、HTTP 接続を再利用する機会がないため、クライアントは反復ごとに Web サーバーに再接続する必要があります。しかし、確かにここではそれ以上のことが起こっています。
EF 自体はかなり高速で、同じ EF コード/モデルがサービスと直接 EF クライアント テストの両方で再利用されます。データ サービスで Xml のシリアル化と逆シリアル化のオーバーヘッドが発生しますが、それだけ!?! 過去に Xml シリアライゼーションで良好なパフォーマンスが得られました。
JSON と Protocol-Buffer エンコーディングを使用していくつかのテストを実行し、パフォーマンスが向上するかどうかを確認しますが、これを高速化するためのアドバイスがコミュニティにあるかどうか知りたいです。
私は IIS が苦手なので、これを改善するために設定できる IIS の微調整 (キャッシュ、接続プールなど) があるのではないでしょうか?