Changeset: 0f8c79f59594 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0f8c79f59594
Modified Files:
        monetdb5/modules/atoms/mtime.c
Branch: Feb2013
Log Message:

Further reduce month/day extraction time
By reducing the loop another 33% was gained on the cost
of extracting month/days in bulk mode.


diffs (77 lines):

diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -233,14 +233,16 @@ static str DAYS[8] = { NULL, "monday", "
 };
 static str COUNT1[7] = { NULL, "first", "second", "third", "fourth", "fifth", 
"last" };
 static str COUNT2[7] = { NULL, "1st", "2nd", "3rd", "4th", "5th", "last" };
-static int NODAYS[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static int LEAPDAYS[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 
};
+//static int NOLEAPDAYS[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 
31 };
 static int CUMDAYS[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 
334, 365 };
+static int CUMLEAPDAYS[13] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 
305, 335, 366 };
 
 date DATE_MAX, DATE_MIN;               /* often used dates; computed once */
 
 #define YEAR_MAX       5867411
 #define YEAR_MIN       -YEAR_MAX
-#define MONTHDAYS(m,y) (((m)!=2)?NODAYS[m]:leapyear(y)?29:28)
+#define MONTHDAYS(m,y) (((m)!=2)?LEAPDAYS[m]:leapyear(y)?29:28)
 #define YEARDAYS(y)    (leapyear(y)?366:365)
 #define LEAPYEARS(y)   (leapyears(y)+((y)>=0))
 #define DATE(d,m,y)    
((m)>0&&(m)<=12&&(d)>0&&(y)!=0&&(y)>=YEAR_MIN&&(y)<=YEAR_MAX&&(d)<=MONTHDAYS(m,y))
@@ -357,15 +359,22 @@ fromdate(int n, int *d, int *m, int *y)
        }
 
        day++;
-       for (month = 1; month <= 12; month++) {
-               int days = MONTHDAYS(month, year);
-
-               if (day <= days){
+       if ( leapyear(year)){
+               for (month = day/28==0?1:day/28; month <= 12; month++) 
+               if ( day > CUMLEAPDAYS[month-1] && day <= CUMLEAPDAYS[month]){
                        if( m) *m = month;
                        if (d == 0) return;
                        break;
                }
-               day -= days;
+               day -= CUMLEAPDAYS[month-1];
+       } else{
+               for (month = day/28==0?1:day/28; month <= 12; month++) 
+               if ( day > CUMDAYS[month-1] && day <= CUMDAYS[month]){
+                       if( m) *m = month;
+                       if (d == 0) return;
+                       break;
+               }
+               day -= CUMDAYS[month-1];
        }
        if( d) *d = day;
        if( m) *m = month;
@@ -974,7 +983,7 @@ rule_fromstr(str buf, int *len, rule **d
        }
 
        /* assign if semantically ok */
-       if (day >= 1 && day <= NODAYS[month] &&
+       if (day >= 1 && day <= LEAPDAYS[month] &&
                hours >= 0 && hours < 60 &&
                minutes >= 0 && minutes < 60) {
                (*d)->s.month = month;
@@ -1108,7 +1117,7 @@ date_prelude(void)
 {
        MONTHS[0] = (str) str_nil;
        DAYS[0] = (str) str_nil;
-       NODAYS[0] = int_nil;
+       LEAPDAYS[0] = int_nil;
        DATE_MAX = todate(31, 12, YEAR_MAX);
        DATE_MIN = todate(1, 1, YEAR_MIN);
        tzone_local.dst = 0;
@@ -1554,7 +1563,7 @@ rule_create(rule *ret, int *month, int *
        if (*month != int_nil && *month >= 1 && *month <= 12 &&
                *weekday != int_nil && ABS(*weekday) <= 7 &&
                *minutes != int_nil && *minutes >= 0 && *minutes < 24 * 60 &&
-               *day != int_nil && ABS(*day) >= 1 && ABS(*day) <= 
NODAYS[*month] &&
+               *day != int_nil && ABS(*day) >= 1 && ABS(*day) <= 
LEAPDAYS[*month] &&
                (*weekday || *day > 0)) {
                ret->s.month = *month;
                ret->s.day = DAY_ZERO + *day;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to