From 3bd6a0f797173f0f073cd818a64daa9d5527f9e2 Mon Sep 17 00:00:00 2001 From: "Christopher Ronnewinkel (D036654)" Date: Wed, 29 Oct 2014 20:09:06 +0100 Subject: [PATCH] performance tree-grow: fix cos(lat) factor in longitude quantization; add wind-cache to wind-field-tracked-race used by tree-grow; --- .../simulator/impl/TimedPositionImpl.java | 19 ++++++++++++++++++- .../impl/WindFieldTrackedRaceImpl.java | 18 +++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/TimedPositionImpl.java b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/TimedPositionImpl.java index e24f240c049..485dd6786d0 100644 --- a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/TimedPositionImpl.java +++ b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/TimedPositionImpl.java @@ -10,7 +10,8 @@ public class TimedPositionImpl implements TimedPosition { * */ private static final long serialVersionUID = -675796846985362731L; - + private transient int hashCode; + TimePoint timePoint; Position position; @@ -29,4 +30,20 @@ public class TimedPositionImpl implements TimedPosition { return position; } + @Override + public boolean equals(Object other) { + TimedPosition that = (TimedPosition) other; + return (this.position.equals(that.getPosition())&&(this.timePoint.equals(that.getTimePoint()))); + } + + @Override + public int hashCode( ) { + if ( hashCode == 0 ) { + hashCode = 17; + hashCode = 37 * hashCode + ( timePoint != null ? timePoint.hashCode( ) : 0 ); + hashCode = 37 * hashCode + ( position != null ? position.hashCode( ) : 0 ); + } + return hashCode; + } + } diff --git a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java index 3d9d94e589d..0a29c351b7d 100644 --- a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java +++ b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java @@ -1,5 +1,7 @@ package com.sap.sailing.simulator.windfield.impl; +import java.util.concurrent.ConcurrentHashMap; + import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.DegreePosition; @@ -8,6 +10,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.simulator.TimedPosition; +import com.sap.sailing.simulator.impl.TimedPositionImpl; import com.sap.sailing.simulator.windfield.WindFieldGenerator; /** @@ -24,10 +27,12 @@ public class WindFieldTrackedRaceImpl extends WindFieldGeneratorImpl implements private static final double EPSILON_DISTANCE_METER = 20; private static final long EPSILON_TIME_MILLIS = 5000; private TrackedRace race; + private final ConcurrentHashMap cache; public WindFieldTrackedRaceImpl(TrackedRace race) { super(null, null); this.race = race; + this.cache = new ConcurrentHashMap<>(); } @Override @@ -35,12 +40,19 @@ public class WindFieldTrackedRaceImpl extends WindFieldGeneratorImpl implements Position pos = timedPosition.getPosition(); double epsLat = (new MeterDistance(EPSILON_DISTANCE_METER)).getCentralAngleDeg(); double qLat = Math.floor(pos.getLatDeg() / epsLat) * epsLat; - double epsLng = epsLat / Math.cos(pos.getLatDeg()); + double epsLng = epsLat / Math.cos(qLat * Math.PI / 180.0); double qLng = Math.floor(pos.getLngDeg() / epsLng) * epsLng; TimePoint time = timedPosition.getTimePoint(); long epsTime = EPSILON_TIME_MILLIS; - long qTime = (long) (Math.floor(time.asMillis() / epsTime) * epsTime); - return this.race.getWind(new DegreePosition(qLat, qLng), new MillisecondsTimePoint(qTime)); + TimePoint qTime = new MillisecondsTimePoint((long) (Math.floor(time.asMillis() / epsTime) * epsTime)); + Position qPosition = new DegreePosition(qLat, qLng); + TimedPosition qTimedPosition = new TimedPositionImpl(qTime, qPosition); + Wind wind = cache.get(qTimedPosition); + if (wind == null) { + wind = this.race.getWind(qPosition, qTime); + cache.put(qTimedPosition, wind); + } + return wind; } }