私は基本的に重要なアプリケーションを作成しようとしています(そして途中でC#を学びます)。速いほど良い。
そのため、最初は複数のスレッドについて考えていました。しかし、私が見ているように、マルチスレッドの全体的なポイントはコードを同時に並行して実行することなので、それは不可能ですよね?
では、複数のスレッドを使用できますか?または、増分を速くするための一般的なヒントはありますか?
ありがとうございました。
私は基本的に重要なアプリケーションを作成しようとしています(そして途中でC#を学びます)。速いほど良い。
そのため、最初は複数のスレッドについて考えていました。しかし、私が見ているように、マルチスレッドの全体的なポイントはコードを同時に並行して実行することなので、それは不可能ですよね?
では、複数のスレッドを使用できますか?または、増分を速くするための一般的なヒントはありますか?
ありがとうございました。
番号範囲を分割する必要があります。たとえば、1 つのスレッドで 0 から 999'999 にインクリメントする代わりに、4 つのスレッドを 0 から 249'999、250'000 から 499'999、500'000 から 749'999、および 750'000 から 999 にインクリメントします。 '999。
Task Parallelism (Task Parallel Library)をご覧ください。
1 回インクリメントする 100 万のタスクを作成するエラーを起こさないでください。マルチタスクのオーバーヘッドにより、実際にはプロセスが大幅に遅くなります。実際には、すべてのタスクがかなりの量の作業を実行する必要がある場合にのみ、速度を上げることができます。
最高のパフォーマンスを得るには、1 つの変数を単純にインクリメントするために、見過ごされがちなInterlockedクラスを使用します。
private long SingleVariable = 0;
public void MultiThreadedMethod()
{
Interlocked.Increment(SingleVariable);
}
マルチスレッド化による利点は認識されませんが、この単純な例では、キャッシュ (キャッシュ コヒーレンス ネットワーク) の帯域幅がボトルネックになると予想されるため、パフォーマンスに関しては賢明です。
ただし、このようなパターンは、複数のスレッドが作業単位を完了し、中央のカウンターをインクリメントして、スレッド全体の合計進行状況を追跡するマルチスレッドの世界で役立つことがよくあります。インターロックに代わる方法は、比較的遅くなる Monitor.Enter (または C# の lock キーワード) を使用することです。