1

非常に小さなインスタンスで実行されている Azure ワーカー ロールがあります。すべてのメッセージをストレージ キューからデキューし、それらを 100 個のチャンクでテーブル ストレージに挿入するだけです。

インスタンスが単一のコアにすぎない場合でも、これらのチャンクを挿入するときに複数のスレッドを生成することに意味があるかどうか疑問に思っていました。私の考えでは、挿入は非同期プロセスであるため (同期的に見えるようにする API 呼び出しを使用していますが)、おそらくコアはほとんどの時間を待機に費やしており、並列に挿入することでパフォーマンスが向上する可能性があります。

挿入は 10 個のテーブル パーティションに行われるため、パーティション間での並列化は非常に簡単です。それが私の最善の策ですか?これを行うために PLINQ を使用できますか? PLINQ はコア数に基づいてスレッドの使用を最適化することを知っていますが、この場合、複数のスレッドが生成されるのでしょうか? 挿入呼び出しの非同期バージョンを使用した場合、テーブル ストレージへの呼び出しが返されたときに複数のスレッドを生成する効果はありませんか?

ありがとう!

4

1 に答える 1

2

複数のスレッドを生成でき、おそらくより高速に実行できます。ご指摘のとおり、ほとんどの時間は I/O に費やされるため、CPU はそれらを切り替えることができます。

ただし、呼び出しの非同期バージョン (Begin/End スタイルの呼び出し、またはDoSomethingAsync().NET 4.5 と最新の SDK を使用している場合は新しいスタイルの呼び出し) を使用すると、パフォーマンスが大幅に向上します。内部では、これらの呼び出しは I/O を処理するためのはるかに効率的な方法である I/O 完了ポートを使用します。おそらくいくつかの良い比較がありますが、私自身の非公式のテストでは、非同期メソッドが約 10 倍高速であることがわかりました。

于 2012-12-12T15:18:07.440 に答える