3

スプリッテレータも実装するデータ構造が与えられたとします。そのスプリッテレータを使用した並列処理が実際に順次処理よりも優れているかどうかをテストする定型コードは何ですか?

4

2 に答える 2

4

スプリッテレータ自体をテストするには、シーケンシャルおよびパラレル ストリームを作成し、最小限のオーバーヘッドで単純なリダクション操作でそれをリダクションします。例えば:

@Benchmark
public sequential(Blackhole bh) {
    bh.consume(StreamSupport.stream(myContainer.spliterator(), false).reduce((a, b) -> a));
}

@Benchmark
public parallel(Blackhole bh) {
    bh.consume(StreamSupport.stream(myContainer.spliterator(), true).reduce((a, b) -> a));
}

trySplit/tryAdvance/forEachRemaining通常、並列スプリッテレータが一連の呼び出しに対して正しく機能するかどうかを確認することがより重要です。速度をテストする前に、正確性を徹底的にテストすることをお勧めします。

また、実生活により近いテストを作成することもおそらく良い考えです。データ構造が本番コードでどのように使用されるかを考え、そのような実際の例を並列および順次に実装するテストを作成します。このような結果は、データ構造のユーザーにとってより関連性があります。

于 2015-08-01T10:00:12.677 に答える
0

Tagir Valeev の回答はすでに基本をカバーしていますが、次の点に留意する必要があります。

並列処理が高速になる 2 つの理由

  • メモリ帯域幅の制約により、単一のコアが処理できるものを制限するデータ構造の完全なサイズ
  • パイプラインの中間/コレクター ステップが十分に高価であるため、それらを並列に実行することで並列化のオーバーヘッドを償却できます。

後者は、はるかに小さいデータ構造サイズですでに成果を上げており、場合によっては非効率的なスプリッテレータの動作でも成果を上げています。

理想的には、両方をテストする必要があります。これは、漸近的に優れたパフォーマンスを発揮しても、曲線の近くでうまく機能するとは限らないためです。

于 2015-08-01T13:35:38.090 に答える