]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CONTRIB: halog: avoid calling time/localtime/mktime for each line
authorWilly Tarreau <w@1wt.eu>
Fri, 23 May 2014 14:36:56 +0000 (16:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 23 May 2014 14:40:25 +0000 (16:40 +0200)
The last commit provides time-based filtering. Unfortunately, it wastes
90% of the time calling the expensive time()/localtime()/mktime()
functions.

This patch does 3 things :
  - call time()/localtime() only once to initialize the correct
    struct timeinfo ;

  - call mktime() only when the time has changed regardless of
    the current second.

  - manually add the current second to the cached result.

Doing just this is enough to multiply the parsing speed by 8.

contrib/halog/halog.c

index 364bf90aeddc096883d2593b081bc32644ce4a13..c686de1e380a4855a2531d6bf9524f7b87a6c512 100644 (file)
@@ -537,7 +537,8 @@ int convert_date_to_timestamp(const char *field)
        unsigned char c;
        const char *b, *e;
        time_t rawtime;
-       struct tm * timeinfo;
+       static struct tm * timeinfo;
+       static int last_res;
 
        d = mo = y = h = m = s = 0;
        e = field;
@@ -651,17 +652,28 @@ int convert_date_to_timestamp(const char *field)
                s = s * 10 + c;
        }
 
-       time(&rawtime);
-       timeinfo = localtime(&rawtime);
+       if (likely(timeinfo)) {
+               if (timeinfo->tm_min == m &&
+                   timeinfo->tm_hour == h &&
+                   timeinfo->tm_mday == d &&
+                   timeinfo->tm_mon == mo - 1 &&
+                   timeinfo->tm_year == y - 1900)
+                       return last_res + s;
+       }
+       else {
+               time(&rawtime);
+               timeinfo = localtime(&rawtime);
+       }
 
-       timeinfo->tm_sec = s;
+       timeinfo->tm_sec = 0;
        timeinfo->tm_min = m;
        timeinfo->tm_hour = h;
        timeinfo->tm_mday = d;
        timeinfo->tm_mon = mo - 1;
        timeinfo->tm_year = y - 1900;
+       last_res = mktime(timeinfo);
 
-       return mktime(timeinfo);
+       return last_res + s;
  out_err:
        return -1;
 }