24

私は 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 の微調整 (キャッシュ、接続プールなど) があるのではないでしょうか?

4

8 に答える 8

2

以下のリンクには、いくつかの興味深い WCF ベンチマークと、WCF データ サービスと Entity Framework の比較を含むビデオがあります。

http://www.relationalis.com/articles/2011/4/10/wcf-data-services-overhead-performance.html

于 2011-04-11T15:20:45.440 に答える
2

代わりに Windows サービスとしてデプロイすることを検討してください。IIS には、実行する ASAPI フィルター、書き換えルールなどがある場合があります。これらのどれもアクティブでない場合でも、IIS パイプラインは非常に長いため、何かがわずかに遅くなる可能性があります。

サービスは、IIS のスローダウンなしで、要求の実行、パックなどにかかる時間の適切なベースラインを提供する必要があります。

于 2010-11-08T23:21:31.937 に答える
1

構成のバインディング セクションでセキュリティを「なし」に設定してみてください。これで大幅に改善されるはずです。

于 2010-10-31T08:04:06.390 に答える
0

WCFの25回の反復をどのように渡しますか?

var WCFobj = new ...Service();
foreach(var calling in CallList)
   WCFobj.Call(...)

このように呼び出すと、WCFを25回呼び出すことになり、リソースを大量に消費します。

私の場合、私はすべてを、DataTable呼び出しているストアドプロシージャのユーザーテーブル名にまとめていました。DataRowparamsです。呼び出すときは、次を使用して暗号化された形式でDataTableを渡すだけです。

var table = new DataTable("PROC_CALLING")...
...
StringBuilder sb = new StringBuilder();
var xml = System.Xml.XmlWriter.Create(sb);
table.WriteXml(xml);
var bytes = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
[optional]use GZip to bytes
WCFobj.Call(bytes);

重要なのは、25の呼び出しすべてを一度に渡すことです。これにより、パフォーマンスを大幅に節約できます。戻りオブジェクトが同じ構造である場合はDataTable、バイト形式のように渡し、に変換して戻しDataTableます。

以前は、データモジュールのインポート/エクスポート用にGZipを使用してこのメ​​ソッドを実装していました。大量のバイトを渡すと、WCFが不幸になります。それはあなたが消費したいものに依存します。コンピューティングリソースまたはネットワークリソース。

于 2010-10-31T06:29:07.337 に答える
0

接続オーバーヘッドのほとんどを排除するために、すべての操作を WCF DS にバッチ処理して、大きな違いが生じるかどうかを確認できます。

NorthwindEntities context = new NorthwindEntities(svcUri);
var batchRequests = 
     new DataServiceRequest[]{someCustomerQuery, someProductsQuery};

var batchResponse = context.ExecuteBatch(batchRequests);

詳細については、こちらを参照してください。

于 2010-10-26T01:03:06.527 に答える
0

WCF DataServices は、さまざまなクライアントに OpenData プロトコルを提供するためのものです。変更要求ごとに複数の Web サービス メソッドを記述/リファクタリングする必要がないためです。システム全体がマイクロソフト テクノロジ スタック ベースである場合は、使用することをお勧めしません。リモートクライアント向けです。

于 2013-05-15T13:33:13.143 に答える
-1

試すべきこと:

1)結果のエンコード:可能であれば、WCFチャネルのバイナリエンコードを使用します。http://msdn.microsoft.com/en-us/magazine/ee294456.aspxを参照してください。代わりに圧縮を使用してください:http://programmerpayback.com/2009 / 02/18 / speed-up-your-app-by-compressing-wcf-service-responses /

2)サービスインスタンスの動作を変更します。http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S6を参照してください-InstanceContextMode = InstanceContextMode.Single、ConcurrencyMode=ConcurrencyMode.Multipleを試してください-確認できる場合サービスはスレッドセーフな方法で構築されています。

ベンチマークに関しては、より現実的な負荷(同時ユーザーを含む)をシミュレートし、外れ値を無視する必要があると思います。IISへの最初の要求は非常に遅くなります(すべてのDLLをロードする必要があります)

于 2010-11-08T20:31:23.340 に答える