Avoid unnecessary division in interval_cmp_value().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 Sep 2021 18:24:03 +0000 (14:24 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 Sep 2021 18:24:03 +0000 (14:24 -0400)
Splitting the time field into days and microseconds is pretty
useless when we're just going to recombine those values.
It's unclear if anyone will notice the speedup in real-world
cases, but a cycle shaved is a cycle earned.

Discussion: https://postgr.es/m/2629129.1632675713@sss.pgh.pa.us

src/backend/utils/adt/timestamp.c

index 1c0bf0aa5c803a6a667a0bc48e07d4f59c95f4fb..cb9faff0bbce8625e45c8f8873a347e8e26794b0 100644 (file)
@@ -2352,20 +2352,17 @@ static inline INT128
 interval_cmp_value(const Interval *interval)
 {
    INT128      span;
-   int64       dayfraction;
    int64       days;
 
    /*
-    * Separate time field into days and dayfraction, then add the month and
-    * day fields to the days part.  We cannot overflow int64 days here.
+    * Combine the month and day fields into an integral number of days.
+    * Because the inputs are int32, int64 arithmetic suffices here.
     */
-   dayfraction = interval->time % USECS_PER_DAY;
-   days = interval->time / USECS_PER_DAY;
-   days += interval->month * INT64CONST(30);
+   days = interval->month * INT64CONST(30);
    days += interval->day;
 
-   /* Widen dayfraction to 128 bits */
-   span = int64_to_int128(dayfraction);
+   /* Widen time field to 128 bits */
+   span = int64_to_int128(interval->time);
 
    /* Scale up days to microseconds, forming a 128-bit product */
    int128_add_int64_mul_int64(&span, days, USECS_PER_DAY);