From d6e15936195a7883f50beb42ea4acf278152320b Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 31 Aug 2026 14:52:44 +0200 Subject: [PATCH] bug6279: new Candidate.getTimePointAsMillis() to accelerate mass-comparisons in large TreeMaps --- .../markpassingcalculation/Candidate.java | 1 + .../MarkPassingCalculator.java | 4 ++-- .../impl/CandidateChooserImpl.java | 5 +--- .../impl/CandidateImpl.java | 23 ++++++++++++++++--- .../test/JumpyTrackSmootheningTest.java | 12 ---------- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/Candidate.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/Candidate.java index 1f7060ac07b..9af43471ea7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/Candidate.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/Candidate.java @@ -37,4 +37,5 @@ public interface Candidate extends Comparable, Timed { int compareTo(Candidate other); + long getTimePointAsMillis(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java index 918f7d91559..91d684de8f6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/MarkPassingCalculator.java @@ -479,7 +479,7 @@ public class MarkPassingCalculator { newCompetitorFixes.get(competitorAndFixesFinderConsidersAffected.getKey()), competitorFixesThatReplacedExistingOnes .get(competitorAndFixesFinderConsidersAffected.getKey())); - tasks.add((race.getTrackedRegatta().cpuMeterCallable(new Callable() { + tasks.add(race.getTrackedRegatta().cpuMeterCallable(new Callable() { @Override public Void call() throws Exception { runnable.run(); @@ -496,7 +496,7 @@ public class MarkPassingCalculator { + competitorAndFixesFinderConsidersAffected.getKey() + " with " + competitorAndFixesFinderConsidersAffected.getValue().size() + " fixes"; } - }, CPUMeteringType.MARK_PASSINGS.name()))); + }, CPUMeteringType.MARK_PASSINGS.name())); } ThreadPoolUtil.INSTANCE.invokeAllAndLogExceptions(executor, Level.INFO, "Error during mark passing calculation: %s", tasks); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateChooserImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateChooserImpl.java index 9c5ec34cc96..18a0c97540b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateChooserImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateChooserImpl.java @@ -39,7 +39,6 @@ import com.sap.sse.common.Distance; import com.sap.sse.common.Duration; import com.sap.sse.common.Speed; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Timed; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.KnotSpeedImpl; @@ -231,8 +230,6 @@ public class CandidateChooserImpl implements CandidateChooser { * */ private class StartAndEndAwareTimeBasedCandidateComparator implements Comparator { - private final Comparator timedComparator = TimedComparator.INSTANCE; - @Override public int compare(Candidate o1, Candidate o2) { int result; @@ -243,7 +240,7 @@ public class CandidateChooserImpl implements CandidateChooser { } else if (o1 == end || o2 == start) { result = 1; } else { - result = timedComparator.compare(o1, o2); + result = (int) (o1.getTimePointAsMillis() - o2.getTimePointAsMillis()); if (result == 0) { result = Integer.compare(o1.getOneBasedIndexOfWaypoint(), o2.getOneBasedIndexOfWaypoint()); if (result == 0) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateImpl.java index 95276ce14a8..6e534f8e1ec 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/markpassingcalculation/impl/CandidateImpl.java @@ -5,18 +5,30 @@ import java.util.Comparator; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.markpassingcalculation.Candidate; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.AbstractTimePoint; public class CandidateImpl implements Candidate { private static final long serialVersionUID = -4626280455738918911L; private final Waypoint w; - private final TimePoint p; + private final boolean timePointAsMillisIsNull; + private final long timePointAsMillis; private final double probability; private final Integer oneBasedIndexOfWaypoint; private final Comparator nullSafeTimePointComparator; + + public class CandidateTimePoint extends AbstractTimePoint implements TimePoint { + private static final long serialVersionUID = 8156956989028606884L; + + @Override + public long asMillis() { + return timePointAsMillis; + } + } public CandidateImpl(int oneBasedIndexOfWaypoint, TimePoint p, double probability, Waypoint w) { this.w = w; - this.p = p; + this.timePointAsMillisIsNull = p == null; + this.timePointAsMillis = p == null ? 0 : p.asMillis(); this.probability = probability; this.oneBasedIndexOfWaypoint = oneBasedIndexOfWaypoint; this.nullSafeTimePointComparator = Comparator.nullsLast(Comparator.naturalOrder()); @@ -29,7 +41,12 @@ public class CandidateImpl implements Candidate { @Override public TimePoint getTimePoint() { - return p; + return timePointAsMillisIsNull ? null : new CandidateTimePoint(); + } + + @Override + public long getTimePointAsMillis() { + return timePointAsMillisIsNull ? -1 : timePointAsMillis; } @Override diff --git a/java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/JumpyTrackSmootheningTest.java b/java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/JumpyTrackSmootheningTest.java index 9fdb8884080..4d67c0faf31 100644 --- a/java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/JumpyTrackSmootheningTest.java +++ b/java/com.sap.sailing.server.trackfiles.test/src/com/sap/sailing/server/trackfiles/test/JumpyTrackSmootheningTest.java @@ -173,13 +173,6 @@ public class JumpyTrackSmootheningTest { @Test public void testMarkPassingCalculatorForAdjusted() throws Exception { -// final java.util.logging.FileHandler fileHandler = -// new java.util.logging.FileHandler( -// System.getProperty("user.home") + "/Desktop/jumpy-markpassing.log", -// false); -// fileHandler.setFormatter(new java.util.logging.SimpleFormatter()); -// java.util.logging.Logger.getLogger("").addHandler(fileHandler); - try { final DynamicGPSFixTrack track = readTrack("GallagherZelenka.gpx.gz"); final Duration durationForAdjustedTrack; final Duration durationForOriginalTrack; @@ -208,11 +201,6 @@ public class JumpyTrackSmootheningTest { assertTrue(durationForAdjustedTrack.times(2).compareTo(durationForOriginalTrack) < 0, "Expected duration for mark passing analysis on adjusted track to be at least two times less than for original track: "+ durationForAdjustedTrack+" vs. "+durationForOriginalTrack); - } finally { -// java.util.logging.Logger.getLogger("").removeHandler(fileHandler); -// fileHandler.close(); - } - } private DynamicGPSFixTrack readTrack(String filename) throws Exception {