2012-01-25 16 views
4

私はnetNamedPipeBindingでWCFサービスを使用して、大量のデータ(非常に長いオブジェクトのリスト)をクライアント(もちろん、同じマシン上にあります)に転送しています。 問題は、コール全体が約250MBのデータを転送するのに約20秒かかります。これは約10MB /秒です。私は、メモリを共有すると、転送速度がはるかに速くなることを期待していました。誰も私のパフォーマンスと転送速度を向上させる方法を知っていますか?WCF with netNamedPipeBinding bad performance

 <netNamedPipeBinding> 
    <binding name="NetNamedPipeBinding_IDataService" closeTimeout="00:10:00" 
     openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
     transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
     hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" 
     maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> 
     <security mode="Transport"> 
     <transport protectionLevel="None" /> 
     </security> 
    </binding> 
    </netNamedPipeBinding> 

どうもありがとう: はここに私のapp.configファイルです!

+2

共有メモリは非常に高速ですが、名前付きパイプは共有メモリではありません。 – vcsjones

+0

OK。正しいですが、バインディングのバックエンドの実装は気にしないでください。これらのレートは、基本的なhttpバインディングから期待されるものであり、はるかに高速でなければならない名前付きパイプバインディングではありません。 – Omri

+0

どのようにスループットを測定していますか?本当にデータ転送時間であり、あなたの「非常に長いオブジェクトリスト」のシリアル化/逆シリアル化ではないと確信していますか? –

答えて

1

コメントのように、おそらく問題の原因となっている転送速度ではなく、よりシリアライゼーションになります。

考慮すべき3つの事があります

  • メモリ内のオブジェクトの保持をシリアライズとデシリアライズのCPU使用率が
  • は、転送速度が

250を送信するためには、それ以上のMBは、まずシリアル化され、次に送信され、次にデシリアライズされます。これにより、メモリ内に3つのデータがコピーされ、ディスクスラッシングが発生する可能性があります。

私たちは数年前に同様の問題を抱え、dllを直接呼び出すように切り替わりました。メモリ参照をリストに渡すとcaになります。 1ミリ秒。