私はそれをより速くするために非常に複雑なプログラムを並列化しています。このために私はほとんどの時間をExecutorService
で使います。これまではかなりうまくいっていましたが、コードのほんの1行でプログラムが半分の速さで実行されることに気付きました。 exactScore.get()
の行です。ExecutorService Future ::非常に遅い
私は理由はわかりませんが、未来オブジェクトの2倍の値を取得するために0.1秒以上かかることがあります。
これはなぜですか?どのように私はそれが速く実行されますそれを処理できますか?マルチスレッド中にDouble[]
に直接書き込む方法はありますか? ありがとう
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(processors);
// initialize output
Double[] presortedExScores = new Double[sortedHeuScores.length];
for(int i =0; i < sortedHeuScores.length; i++){
final int index = i;
final Collection<MolecularFormula> formulas_for_exact_method = multimap.get(sortedHeuScores[i]);
for (final MolecularFormula formula : formulas_for_exact_method){
Future<Double> exactScore = service.submit(new Callable<Double>() {
@Override
public Double call() throws Exception {
return getScore(computeTreeExactly(computeGraph(formula)));
}
});
presortedExScores[index] = exactScore.get();
}
}
私はすでにforループでそれを取得しようとしないと良いでしょうか?私がexactScor.getが完了するまで、あなたが正しくあなたを理解すれば、他のエグゼキュータはジョブを取得しないため(この時点では新しいマルチスレッドは存在しません)。 – user312549
私の様々なアップデートをご覧ください。 2つのループで物事を分割することができます。それは本当に単純なSOの質問/回答の議論を超えていることに依存しています。 – GhostCat