2017-11-14 9 views
0

私が動作しているストリームがMemoryStreamであることがわかっている場合は、非同期メソッド(CopyToAsync、ReadAsyncなど)を使用しないほうがよいですか?memorystreamsで非同期I/Oを使用する必要がありますか?

Stephen Clearlyのコメントthis SO questionは、多くの同時リクエストを処理できるサーバーアプリケーションで私が使用しているアプローチに疑問を感じました。

このアプリケーションでは、スレッドは無駄にならないようにすべてのI/Oが非同期に行われます。しかし、CopyToAsync f.i. MemoryStreamで実際に非同期ではありませんが、私は、サーバーアプリケーションでさえ、MemoryStreamで非同期操作を使用する利点があるのだろうかと思います。

+2

'MemoryStream'は、メモリが割り当てられていて一般的に不必要にコピーされていることを意味するので、パフォーマンスを上げようとしているときの匂いです。しかし、コードがすでに完全に非同期であれば特別なケースを使用する必要はありません。if(ストリームはMemoryStream)の束を持っています。チェックは実際の性能をほとんど改善しませんメモリストリームを完全に排除するのではなく、 YMMVは、もちろん、プロファイリングはもっとあなたに伝えるべきです。 –

+0

私はすでにプロファイリングしており、asyncを使うのはストレートシンクを使うよりも遅いです。私は当初、非同期を使用するとアプリケーションが重い負荷ではパフォーマンスが向上すると思っていましたが、memorystreamに対する非同期は実際には非同期ではないため、不要なオーバーヘッドが追加されます。ですから、Mem-StreamでCopyToAsyncを使うのはどういうことでしょうか? –

+0

メモリストリームからメモリストリームにコピーすると何も得られません。それは単に書き込みを使用し、完了した[タスク](https://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,1a4dcb744a23ba6f)を返します。 –

答えて

4

MemoryStreamの実装をチェックすると、実際には追加スレッドを使用せずにReadAsync(およびWriteAsync)が同期していることがわかります。いくつかのオーバーヘッドがありますが、かなり小さく、無視してください。

CopyToAsyncは別の獣です。他の非同期メソッドは1つのスレッドでしか機能しませんが、CopyToAsyncは2つで動作します。あなたのソースMemoryStreamは非同期の恩恵を受けませんが、宛先スレッドは可能です。もちろん、両方のストリームがメモリストリームの場合、何のメリットも得られません。

一般的にあなたの質問に答えて、MemoryStreamは、他のストリーム実装との一貫性のためだけに非同期メソッドを持っています。しかし、あなたがそれを使用しているときは、パフォーマンスの大幅な低下はありません。

P.S. MemoryStreamで良好なパフォーマンスが必要な場合は、再割り当てを避けたり、基礎となるバッファを再利用したりするのが良いでしょう。しかし、asyncとは無関係のトピックです。

関連する問題