CONTRIB: halog: avoid calling time/localtime/mktime for each line

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.
This commit is contained in:
Willy Tarreau 2014-05-23 16:36:56 +02:00
parent e97b904801
commit 9f66aa9cc4

View 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;
}