エラトステネスの篩に対する逐次アプローチと同時アプローチの間の相関関係は、提供されている Java コードではすぐにはわかりません。ここでは、同時実装の速度を低下させる可能性がある潜在的な問題を調べます:
1.同期オーバーヘッド:
- アルゴリズムの同時バージョンは、素数の倍数を取り消すプロセスを並列化しようとします。ただし、コードには適切な同期メカニズムが欠けているようで、競合状態や不正確な結果が発生する可能性があります。
2.スレッドの過剰な作成:
- PrimeThread クラスは、使用可能なプロセッサごとに 2 つのスレッドを作成します。ただし、これは過剰になる可能性があり、スレッド管理によるオーバーヘッドが発生する可能性があります。一般に、使用可能なプロセッサの数を超えるスレッドを作成することはお勧めできません。
3.非効率なスレッド使用率:
- PrimeThread クラスは 2 種類のスレッドを作成します。1 つは最初の sqrt(n) 素数の生成用で、もう 1 つは残りの素数の生成用です。これはスレッドを効率的に使用できない可能性があります。最初の素数を生成するスレッドを 1 つ用意し、その後に残りの素数を生成するために並行して動作する複数のスレッドを用意する方がよいでしょう。
4.共有状態管理の欠如:
- 同時バージョンは、異なるスレッド間を調整するために currentState メンバー変数に依存します。ただし、この変数は適切に同期されていないため、スレッドが適切なタイミングで正しい状態にアクセスするという保証はありません。
5.間違った除算ロジック:
- generateMyPrimes メソッドでは、コードは現在の数値 (curr) を 3 から始まる素数で除算しようとします。ただし、n の平方根未満の素数はすでに除算されています。前のステップ (generateSqrtPrimes) で生成されています。この冗長な除算により、計算が遅くなる可能性があります。
同時実装のパフォーマンスを向上させるには、次の問題に対処することをお勧めします。
- 競合を防ぐために適切な同期メカニズムを実装する
- ハードウェアとタスクに適切な数のスレッドを使用します。
- スレッドを効率的に割り当てることで、スレッド使用率を最適化します。
- 共有状態を慎重に管理し、アクセスを同期します。
- 不必要な計算を避けるために除算ロジックをリファクタリングします。
以上がJava での同時実行のエラトステネスのふるいの実装が、順次的な実装よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。