mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-26 07:26:41 +00:00
using ForkJoinPool for ORC PCS parallelization (still slow...)
Change-Id: I660ea9afc6cf0bdb286548c39e2f0c726eb6b211
This commit is contained in:
+7
-20
@@ -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);
|
||||
|
||||
+8
-2
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user