ThreeTen / threeten

This project was the home of code used to develop a modern date and time library for JDK8. Development has moved to OpenJDK and a separate backport project, threetenbp.
http://threeten.github.io/
191 stars 37 forks source link

Optimse Period addition #330

Closed jodastephen closed 10 years ago

jodastephen commented 10 years ago

The Period.addTo method is relatively complicated and should be fast-tracked for the common cases of LocalDate, LocalDateTime, ZonedDateTime.

jodastephen commented 10 years ago

This patch makes the change. The optimisation level in this patch is medium, rather than full, as full optimisation would involve writing a dedicated algorithm and package scoped methods with greater chance of bug.

diff -r 31abdb418315 src/share/classes/java/time/LocalDate.java
--- a/src/share/classes/java/time/LocalDate.java    Thu Aug 08 11:47:50 2013 -0700
+++ b/src/share/classes/java/time/LocalDate.java    Sun Aug 25 22:39:21 2013 +0100
@@ -1125,6 +1125,11 @@
      */
     @Override
     public LocalDate plus(TemporalAmount amountToAdd) {
+        Objects.requireNonNull(amountToAdd, "amountToAdd");
+        if (amountToAdd instanceof Period) {
+            Period periodToAdd = (Period) amountToAdd;
+            return plusMonths(periodToAdd.toTotalMonths()).plusDays(periodToAdd.getDays());
+        }
         return (LocalDate) amountToAdd.addTo(this);
     }

@@ -1353,6 +1358,11 @@
      */
     @Override
     public LocalDate minus(TemporalAmount amountToSubtract) {
+        Objects.requireNonNull(amountToSubtract, "amountToSubtract");
+        if (amountToSubtract instanceof Period) {
+            Period periodToSubtract = (Period) amountToSubtract;
+            return minusMonths(periodToSubtract.toTotalMonths()).minusDays(periodToSubtract.getDays());
+        }
         return (LocalDate) amountToSubtract.subtractFrom(this);
     }

diff -r 31abdb418315 src/share/classes/java/time/LocalDateTime.java
--- a/src/share/classes/java/time/LocalDateTime.java    Thu Aug 08 11:47:50 2013 -0700
+++ b/src/share/classes/java/time/LocalDateTime.java    Sun Aug 25 22:39:21 2013 +0100
@@ -1129,6 +1129,11 @@
      */
     @Override
     public LocalDateTime plus(TemporalAmount amountToAdd) {
+        Objects.requireNonNull(amountToAdd, "amountToAdd");
+        if (amountToAdd instanceof Period) {
+            Period periodToAdd = (Period) amountToAdd;
+            return with(date.plus(periodToAdd), time);
+        }
         return (LocalDateTime) amountToAdd.addTo(this);
     }

@@ -1343,6 +1348,11 @@
      */
     @Override
     public LocalDateTime minus(TemporalAmount amountToSubtract) {
+        Objects.requireNonNull(amountToSubtract, "amountToSubtract");
+        if (amountToSubtract instanceof Period) {
+            Period periodToSubtract = (Period) amountToSubtract;
+            return with(date.minus(periodToSubtract), time);
+        }
         return (LocalDateTime) amountToSubtract.subtractFrom(this);
     }

diff -r 31abdb418315 src/share/classes/java/time/ZonedDateTime.java
--- a/src/share/classes/java/time/ZonedDateTime.java    Thu Aug 08 11:47:50 2013 -0700
+++ b/src/share/classes/java/time/ZonedDateTime.java    Sun Aug 25 22:39:21 2013 +0100
@@ -1540,6 +1540,11 @@
      */
     @Override
     public ZonedDateTime plus(TemporalAmount amountToAdd) {
+        Objects.requireNonNull(amountToAdd, "amountToAdd");
+        if (amountToAdd instanceof Period) {
+            Period periodToAdd = (Period) amountToAdd;
+            return resolveLocal(dateTime.plus(periodToAdd));
+        }
         return (ZonedDateTime) amountToAdd.addTo(this);
     }

@@ -1787,6 +1792,11 @@
      */
     @Override
     public ZonedDateTime minus(TemporalAmount amountToSubtract) {
+        Objects.requireNonNull(amountToSubtract, "amountToSubtract");
+        if (amountToSubtract instanceof Period) {
+            Period periodToSubtract = (Period) amountToSubtract;
+            return resolveLocal(dateTime.minus(periodToSubtract));
+        }
         return (ZonedDateTime) amountToSubtract.subtractFrom(this);
     }
RogerRiggs commented 10 years ago

Looks fine.

RogerRiggs commented 10 years ago

JBS mirror is 8023764.

jodastephen commented 10 years ago

I can't push this:

1 changesets found
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 3 changes to 3 files
remote: [jcheck  ]
remote:
remote: > Changeset: 8575:27dc14b3de87
remote: > Author:    scolebourne@joda.org
remote: > Date:      2013-08-27 09:11
remote: >
remote: > Optimize period addition/subtraction
remote: > Fixes GitHub #330, JBS #8023764
remote:
remote: Invalid changeset author: scolebourne@joda.org
remote:
remote: abort: pretxnchangegroup.0.jcheck hook failed
remote: transaction abort!
remote: rollback completed
abort: unexpected response: empty string
jodastephen commented 10 years ago

http://hg.openjdk.java.net/threeten/threeten/jdk/rev/0a67e8e42e49