From: Willy Tarreau Date: Fri, 23 May 2014 14:36:56 +0000 (+0200) Subject: CONTRIB: halog: avoid calling time/localtime/mktime for each line X-Git-Tag: v1.5-dev26~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f66aa9cc40d5cc5405b23ddc100068474252fb4;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/contrib/halog/halog.c b/contrib/halog/halog.c index 364bf90aed..c686de1e38 100644 --- a/contrib/halog/halog.c +++ b/contrib/halog/halog.c @@ -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; }