1

50,000個のオブジェクトのコレクションを考えてみましょう。 各オブジェクトは、doWork()メソッドを使用して、反復ごとに10倍の2倍を生成します。これを並列に実装する最も効率的な方法は何ですか?

それぞれ50,000個のオブジェクトを処理する連続whileループがあり、 はdoWork()を呼び出します。 この後、作成された10個の2倍のそれぞれをprocess()を呼び出して処理する必要があります。

whileループ内の最後のステップでは、各繰り返しで生成された倍音を合計し、出力をログに記録する必要があります。

doWork()とprocess()の完了にかかる相対的な時間は設計によって異なりますか?

このアルゴリズムを実装する最も高速で最も効率的な方法は何ですか?

私はExecutorServiceのかForkJoinを使用する必要があります...複数のコアの使用は大いに役立つだろう作る

を想像?

タスクを分割するにはどうすればよいですか?

List<A> listA = new ArrayList<>(); 
populateWith50k(listA); // has 50k objects after this line 
List<Double> listB = new ArrayList<>(); 

while(true){ 

    // causes a side affect, hence a change of state that the remaining code 
    // depends on, hence I don't think we can use java streams... 
    changeState(); 

    // the below depends on the system state setup above 
    for (int i=0;i<listA.size();i++){ 
     A a = listA.get(i); 
     a.doWork(); 
     populateUsingA(a); // populates listB, each A creates 10 doubles 
     for (int j=0;j<listB.size();j++){ 
      B b = listB.get(j); 
      b.process(); 
     } 
     sumAndThenLogValuesInListB(a); 
     listB.clear(); 
    } 
} 

答えて

2

おそらく並列ストリームを使用する必要があります。

listA.parallelStream().flatMapToDouble(A::doWork).sum() 

は、whileループの1回の合計を示します。を変更して、直ちに10倍を出力するか、またはそれを行う別の方法を導入するか、それを行うより複雑なラムダ本体を作成する必要があります(読みやすさのために推奨しません)。

+0

changeState()メソッドには影響があるため、機能しないかどうかはわかりませんが、複雑なために機能的なコードのスタイルでリファクタリングすることはできません。理解する。申し訳ありませんが、whileループのすべてのサイクルで依存状態の変化を引き起こす、サイドの影響に対する依存性を強調しませんでした。 – newlogic

関連する問題