Я распараллеливаю довольно сложную программу, чтобы получить ее быстрее. Для этого я использую большую часть времени ExecutorService
. До сих пор это работало очень хорошо, но потом я заметил, что только одна строка кода заставляет мою программу работать как можно быстрее. Это линия с exactScore.get()
.ExecutorService Future :: получите очень медленный
Я не знаю почему, но иногда требуется больше 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? Поскольку, если я правильно вас понимаю, другие Исполнители не получат заданий, пока мой точныйScor.get не будет завершен (так что в это время нет новых многопотоков). – user312549
См. Мои различные обновления. Это может помочь разбить вещи на две петли; но это действительно зависит от того, что выходит за рамки простого обсуждения вопросов и ответов SO. – GhostCat