Ich bin parallelisieren ein recht komplexes Programm, um es schneller zu bekommen. Dafür nutze ich die meiste Zeit die ExecutorService
. Bis jetzt funktionierte es ziemlich gut, aber dann bemerkte ich, dass nur eine Codezeile mein Programm halb so schnell laufen ließ wie es konnte. Es ist die Linie mit exactScore.get()
.ExecutorService Future :: bekommen sehr langsam
Ich weiß nicht warum, aber es braucht manchmal mehr als 0,1 s, nur um den doppelten Wert des Future Object zu erhalten.
Warum ist das? Wie kann ich damit umgehen, dass es schneller läuft? Gibt es eine Möglichkeit, beim Multithreading direkt in die Double[]
zu schreiben? Danke
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();
}
}
also wäre es besser wenn ich nicht versuche es schon in die for-schleife zu bekommen? Weil, wenn ich dich richtig verstehe, die anderen Executors keine Jobs bekommen werden, bis mein exactScor.get abgeschlossen ist (also keine neuen Multithreads in dieser Zeit). – user312549
Bitte beachten Sie meine verschiedenen Updates. Es könnte helfen, Dinge in zwei Schleifen zu teilen; Aber das hängt wirklich von Dingen ab, die über eine einfache SO-Frage/Antwort-Diskussion hinausgehen. – GhostCat