2017-01-31 17 views
1

私のクラスでIOのボトルネックを見つけようとしていて、驚いたことに、ファイルに1000000メッセージを書き込むときより速くsw.Write("m"); sw.Flush()を20000にすることができます。万が一、なぜ誰が知っていますか? StreamWriterのコンストラクタがStringであると、asyncのストリームのパラメータが設定されていません。StreamWriter:(Write + Flush)Asyncが同期よりもずっと遅い

以下のコードは、C#のインタラクティブから起動できます。はい、それは速度を測定するのに最適な場所ではないのですが、それはとにかく手元に問題が表示されます:C#インタラクティブから私の自宅のPC上で起動さ

var sr = new StreamWriter("G:\\file.file"); 
var N = 1000; 
var sw = new Stopwatch(); 
sw.Start(); 

for (var i = 0; i < N; ++i) 
{ 
    sr.Write("m"); // or await sr.WriteAsync("m"); 
    sr.Flush(); // or await sr.FlushAsync("m"); 
} 

sw.Stop(); 
Console.WriteLine("Completed " + N 
    + " iterations in " + sw.ElapsedMilliseconds + " milliseconds."); 

sr.Close(); 

出力が1で千回の反復を完了

ですミリ秒。同期コードと

ため

43383ミリ秒1000回の反復を完了しました。

(非同期)。

更新:また、私はプログラムがFlushAsyncの内側に遅くなることに気付きました。 WriteAsyncは、同期バージョンとほぼ同じ速度で動作します。

すべてのコメントを歓迎します。

+0

おそらく[この回答](http://stackoverflow.com/a/18335900/4372746)を参照してください。また、完全な投稿を作成するために2時間待っていたのは間違いないでしょうか? –

+0

@Glorin Oakenfootのリンクに感謝します。私は悪いですが、私はおそらくそれを忘れるかもしれないと心配しました:-( –

+0

なぜ誰もAsync Writeメソッドを使用するのか分かりません。Sync WriteとAsync Writeの違いはほとんどありません。 – jdweng

答えて

4

StreamWriterファイルパスが指定されている場合、非同期モードでその基本ストリームを開きません。これはパフォーマンスの低下につながる可能性があります。あなたは非同期のためにそれを使用するつもりなら、あなたはあなた自身のStreamを開くべきである:

Stream s = new FileStream("G:\\file.file", FileMode.Create, FileAccess.Write, 
          FileShare.None, 4096, 
          FileOptions.Asynchronous | FileOptions.SequentialScan); 
StreamWriter sr = new StreamWriter(s); 

注意することは、追加の何かが、あなたのベンチマークは、現実世界の使用をキャプチャしていないようだということです。あなたは本当に1文字の文字列を書いていて、それぞれの後にフラッシュしていますか?

Asyncには一定のメモリ量とGCオーバーヘッドがあり、そのような短期間の処理が行われます.-特にStreamWriter.WriteAsyncは小規模な書き込み用に最適化されていません。使用法。

+0

私は 'ストリーム 'を手動で作成しても、それでも同期バージョンの方がはるかに遅いです。 いいえ、私は単一文字列を書いていませんが、短いログメッセージを書きます。非同期操作は1秒間に数百万回呼び出され、すべて正常です。 –

+1

また、実際の問題はFlushAs ync'となる。'WriteAsync'は、同期バージョンとほぼ同じ速度で動作します。 –

+1

'FileStream'の' FlushAsync'は、残念ながらfake asyncで実装されています。私はそれがうまく行かないと思います。 –

関連する問題