using ForkJoinPool for ORC PCS parallelization (still slow...)

Change-Id: I660ea9afc6cf0bdb286548c39e2f0c726eb6b211
This commit is contained in:
Axel Uhl
2019-10-14 23:54:20 +02:00
parent 3d1c67e5ef
commit dd39bd7f85
2 changed files with 15 additions and 22 deletions
@@ -8,9 +8,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ForkJoinTask;
import java.util.function.BiFunction;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -57,7 +55,6 @@ import com.sap.sse.common.Speed;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.util.ThreadPoolUtil;
public class ORCPerformanceCurveByImpliedWindRankingMetric extends AbstractRankingMetric {
private static final long serialVersionUID = -7814822523533929816L;
@@ -88,12 +85,6 @@ public class ORCPerformanceCurveByImpliedWindRankingMetric extends AbstractRanki
*/
private Competitor explicitScratchBoat;
final private static ScheduledExecutorService executor;
static {
executor = ThreadPoolUtil.INSTANCE.createForegroundTaskThreadPoolExecutor("ORC PCS Executor");
}
/**
* TODO maybe it's a good idea to cache the {@link ORCPerformanceCurve} objects and implied wind speeds for all competitors involved in this object which serves as some sort of cache for ranking calculations for a single time point
*
@@ -506,25 +497,21 @@ public class ORCPerformanceCurveByImpliedWindRankingMetric extends AbstractRanki
final Competitor competitorFarthestAhead = getCompetitorFarthestAhead(timePoint, cache);
if (startOfRace != null) {
final Duration actualRaceDuration = startOfRace.until(timePoint);
final Set<Future<Pair<Competitor, CompetitorRankingInfoImpl>>> futures = new HashSet<>();
final Set<ForkJoinTask<Pair<Competitor, CompetitorRankingInfoImpl>>> futures = new HashSet<>();
for (final Competitor competitor : getTrackedRace().getRace().getCompetitors()) {
futures.add(executor.submit(()->{
futures.add(ForkJoinTask.adapt(()->{
final Duration correctedTime = getCorrectedTime(competitor, timePoint, cache);
return new Pair<>(competitor, new CompetitorRankingInfoImpl(
timePoint, competitor, getWindwardDistanceTraveled(competitor, timePoint, cache),
actualRaceDuration, correctedTime,
getEstimatedActualDurationToCompetitorFarthestAhead(competitor, competitorFarthestAhead, timePoint, cache),
correctedTime));
}));
}).fork());
}
for (final Future<Pair<Competitor, CompetitorRankingInfoImpl>> future : futures) {
for (final ForkJoinTask<Pair<Competitor, CompetitorRankingInfoImpl>> future : futures) {
Pair<Competitor, CompetitorRankingInfoImpl> resultForCompetitor;
try {
resultForCompetitor = future.get();
competitorRankingInfo.put(resultForCompetitor.getA(), resultForCompetitor.getB());
} catch (InterruptedException | ExecutionException e) {
logger.log(Level.SEVERE, "Problem trying to evaluate ORC ranking info", e);
}
resultForCompetitor = future.join();
competitorRankingInfo.put(resultForCompetitor.getA(), resultForCompetitor.getB());
}
}
return new ORCPerformanceCurveRankingInfo(timePoint, competitorFarthestAhead, competitorRankingInfo, cache);
@@ -5,7 +5,9 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ForkJoinTask;
import java.util.function.BiFunction;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -61,9 +63,13 @@ public class ORCPerformanceCurveRankingMetric extends ORCPerformanceCurveByImpli
private Map<Competitor, Duration> getRelativeCorrectedTimesByCompetitor(TimePoint timePoint, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) {
final Map<Competitor, Duration> relativeCorrectedTimesByCompetitor = new HashMap<>();
final Map<Competitor, ForkJoinTask<Duration>> futures = new HashMap<>();
for (final Competitor competitor : getTrackedRace().getRace().getCompetitors()) {
relativeCorrectedTimesByCompetitor.put(competitor, cache.getRelativeCorrectedTime(competitor, getTrackedRace(), timePoint,
(c, t)->getRelativeCorrectedTime(c, t, cache)));
futures.put(competitor, ForkJoinTask.adapt(()->cache.getRelativeCorrectedTime(competitor, getTrackedRace(), timePoint,
(c, t)->getRelativeCorrectedTime(c, t, cache))).fork());
}
for (final Entry<Competitor, ForkJoinTask<Duration>> entry : futures.entrySet()) {
relativeCorrectedTimesByCompetitor.put(entry.getKey(), entry.getValue().join());
}
return relativeCorrectedTimesByCompetitor;
}