2012-03-28 5 views
0

私はthe article on copying streams asynchronouslyを読んでいます。 読み書きに使用されるバッファは1つだけであることに気付きました。ここでは、非同期ストリームコピーで何かを得ることができます。

非同期呼び出しを使用してストリームコピーを行うと、何かが得られますか?

バッファが1つあるため、実行時の非同期ソリューションは非常に同期しているようです。 書き込みは読み出しを待たなければならず、次の読み出しはバッファが書き込まれるまで待たなければなりませんでした。

いくつかの考え:

私は複数のバッファを使用してバリアントを見てきました。 IMHOは物事をより複雑にし、より多くのメモリを使い、問題を延期します。 複数の読み込みを並行して実行することができます。

ファイルの場合、私はよりリラックスした書き込みのソリューションを思い浮かべることができます:すべてのファイルが読み込まれたときに読み込み時にブロックを書き込んで固定する。 (ファイルシステムがこれをサポートしている必要があります)。

.NET 3.5を使用していて、.NET 4または4.5をまだ使用できないため、記事を読みました。

(マイクロソフトドットコムADRESバウンスでnetqa)

答えて

2

非CPU関連のレイテンシを扱うときに非同期処理が役立ち、莫大な量のスレッドを必要としないスレッドを避けたい場合(スケーリングに問題がありません。つまり、スレッド数「高価な」リソースであり、豊富なコンテキスト切り替えによってパフォーマンスが低下する可能性があります)。

したがって、ディスクとネットワークの両方がデータを処理するために必要な計算作業に比べて「遅い」ため、一般的な恩人はIO操作です。したがって、多くの並列ストリーム(ネットワークとディスク)がある場合はいつでも、非同期操作を使用して処理する必要があります。

これは、適切な非同期プログラミングが難しいことです。特に、新しい.NETコンパイラでのベーキングサポートはありません。

良い非同期コピーでは、少なくとも2つのバッファを使用する必要があります。 1つはデータ(非同期)を読み取り、もう1つはデータ(非同期)を同時に書き込みます。もちろん、アイドルライターは、そのブロックでリーダーが終了した後にのみ開始され、アイドルリーダーは、少なくとも予備バッファ(例えば、ライターが書き込みを終了した)があるときにのみ開始する。 1つのバッファのみを使用すると、連続した読み込みと書き込みの間にブレークが発生します。それは常に "読み込み、書き込み、読み込み、書き込み..."の代わりに "読み込み、読み込み+書き込み、読み出し+書き込み、書き込み"の代わりに "読み込み、書き込み、読み出し、

1

書き込みはそれがない。もちろん、

を読むために待たなければなりません。あなたがまだデータを読まなかったらあなたは何を書いていますか?

バッファが書き込まれるまで次の読み取りを待たなければなりませんでした。

これを回避することは、場合によっては意味をなさないかもしれませんが、実際にプロファイルする必要があります。さまざまなキャッシュや、ハードディスクからデータを読み書きする方法は、これに影響を与える可能性があります。パフォーマンス上のメリットがある場合は、おそらくそれほど大きくないでしょう。非同期呼び出しは私に何かを得る使ってストリームのコピーをやってん

:あなたの主な質問への今

IOはIOの実行中にスレッドをブロックしていないという事実から利益が得られます。これは、スレッドが高価なリソースであるため(特に、仮想メモリと物理メモリの両方に1 MB必要)、パフォーマンスにとって重要です。これは、ASP.NETのような環境では、それぞれの要求が別のスレッドで処理される場合に大きな違いを生む可能性があります。

いくつかのファイルをコピーするだけのデスクトップアプリケーションを作成している場合は、UIスレッドをブロックしない限り、これはおそらく問題ではありません。

関連する問題