8074003: java.time.zone.ZoneRules.getOffset(java.time.Instant) can be optimized
authorplevart
Mon, 04 May 2015 10:13:19 +0200
changeset 30321 ec4de14b3161
parent 30320 e868aabb6a2a
child 30322 c08d5c975168
8074003: java.time.zone.ZoneRules.getOffset(java.time.Instant) can be optimized Summary: Make epochSecond part of ZoneOffsetTransition so it doesn't have to be recomputed frequently Reviewed-by: scolebourne, rriggs
jdk/src/java.base/share/classes/java/time/zone/ZoneOffsetTransition.java
--- a/jdk/src/java.base/share/classes/java/time/zone/ZoneOffsetTransition.java	Sat May 02 22:51:45 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneOffsetTransition.java	Mon May 04 10:13:19 2015 +0200
@@ -104,6 +104,10 @@
      */
     private static final long serialVersionUID = -6946044323557704546L;
     /**
+     * The transition epoch-second.
+     */
+    private final long epochSecond;
+    /**
      * The local transition date-time at the transition.
      */
     private final LocalDateTime transition;
@@ -152,6 +156,7 @@
      * @param offsetAfter  the offset at and after the transition, not null
      */
     ZoneOffsetTransition(LocalDateTime transition, ZoneOffset offsetBefore, ZoneOffset offsetAfter) {
+        this.epochSecond = transition.toEpochSecond(offsetBefore);
         this.transition = transition;
         this.offsetBefore = offsetBefore;
         this.offsetAfter = offsetAfter;
@@ -165,6 +170,7 @@
      * @param offsetAfter  the offset at and after the transition, not null
      */
     ZoneOffsetTransition(long epochSecond, ZoneOffset offsetBefore, ZoneOffset offsetAfter) {
+        this.epochSecond = epochSecond;
         this.transition = LocalDateTime.ofEpochSecond(epochSecond, 0, offsetBefore);
         this.offsetBefore = offsetBefore;
         this.offsetAfter = offsetAfter;
@@ -209,7 +215,7 @@
      * @throws IOException if an error occurs
      */
     void writeExternal(DataOutput out) throws IOException {
-        Ser.writeEpochSec(toEpochSecond(), out);
+        Ser.writeEpochSec(epochSecond, out);
         Ser.writeOffset(offsetBefore, out);
         Ser.writeOffset(offsetAfter, out);
     }
@@ -253,7 +259,7 @@
      * @return the transition epoch second
      */
     public long toEpochSecond() {
-        return transition.toEpochSecond(offsetBefore);
+        return epochSecond;
     }
 
     //-------------------------------------------------------------------------
@@ -397,7 +403,13 @@
      */
     @Override
     public int compareTo(ZoneOffsetTransition transition) {
-        return this.getInstant().compareTo(transition.getInstant());
+        if (epochSecond < transition.epochSecond) {
+            return -1;
+        } else if (epochSecond > transition.epochSecond) {
+            return 1;
+        } else {
+            return this.getInstant().compareTo(transition.getInstant());
+        }
     }
 
     //-----------------------------------------------------------------------
@@ -416,7 +428,8 @@
         }
         if (other instanceof ZoneOffsetTransition) {
             ZoneOffsetTransition d = (ZoneOffsetTransition) other;
-            return transition.equals(d.transition) &&
+            return epochSecond == d.epochSecond &&
+                transition.equals(d.transition) &&
                 offsetBefore.equals(d.offsetBefore) && offsetAfter.equals(d.offsetAfter);
         }
         return false;