From 3f9402602d4c670acdc58dc91e4a451797d6f5b1 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 8 Nov 2008 08:24:38 +0000 Subject: [PATCH] Optimisations in HTML generation: do not keep calling get_indices() when we already know the answers, and move all the round_and_format_age() calls to the top of html_query() instead of duplicating them all over the rest of the file. Saves about 60% time on Linux, and a staggering factor of 25 on my Mac (on which, apparently, mktime() is ludicrously slow). git-svn-id: svn://svn.tartarus.org/sgt/agedu@8292 cda61777-01e9-0310-a592-d414129be87e --- html.c | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/html.c b/html.c index db6c25b..5ca85e0 100644 --- a/html.c +++ b/html.c @@ -19,7 +19,8 @@ struct html { char *href; size_t hreflen; const char *format; - unsigned long long thresholds[MAXCOLOUR-1]; + unsigned long long thresholds[MAXCOLOUR]; + char *titletexts[MAXCOLOUR+1]; time_t now; }; @@ -171,13 +172,10 @@ static void get_indices(const void *t, char *path, path[pathlen-1] = c2; } -static unsigned long long fetch_size(const void *t, char *path, +static unsigned long long fetch_size(const void *t, + unsigned long xi1, unsigned long xi2, unsigned long long atime) { - unsigned long xi1, xi2; - - get_indices(t, path, &xi1, &xi2); - return index_query(t, xi2, atime) - index_query(t, xi1, atime); } @@ -213,7 +211,6 @@ static void begin_colour_bar(struct html *ctx) static void add_to_colour_bar(struct html *ctx, int colour, int pixels) { int r, g, b; - char buf[80]; if (colour >= 0 && colour < 256) /* red -> yellow fade */ r = 255, g = colour, b = 0; @@ -222,26 +219,12 @@ static void add_to_colour_bar(struct html *ctx, int colour, int pixels) else /* background grey */ r = g = b = 240; - if (colour < 0) { - /* no title text here */ - } else if (colour == 0) { - strcpy(buf, "< "); - round_and_format_age(ctx, ctx->thresholds[0], buf+5, 0); - } else if (colour == MAXCOLOUR) { - strcpy(buf, "> "); - round_and_format_age(ctx, ctx->thresholds[MAXCOLOUR-1], buf+5, 0); - } else { - unsigned long long midrange = - (ctx->thresholds[colour] + ctx->thresholds[colour+1]) / 2; - round_and_format_age(ctx, midrange, buf, 0); - } - if (pixels > 0) { htprintf(ctx, "= 0) - htprintf(ctx, " title=\"%s\"", buf); + htprintf(ctx, " title=\"%s\"", ctx->titletexts[colour]); htprintf(ctx, ">\n"); } } @@ -300,7 +283,7 @@ static struct vector *make_vector(struct html *ctx, char *path, atime = ULLONG_MAX; else atime = ctx->thresholds[i]; - vec->sizes[i] = fetch_size(ctx->t, path, atime); + vec->sizes[i] = fetch_size(ctx->t, xi1, xi2, atime); } return vec; @@ -492,9 +475,26 @@ char *html_query(const void *t, unsigned long index, ctx->oldest = round_and_format_age(ctx, ctx->oldest, agebuf1, 0); ctx->newest = round_and_format_age(ctx, ctx->newest, agebuf2, 0); } - for (i = 0; i < MAXCOLOUR-1; i++) { + for (i = 0; i < MAXCOLOUR; i++) { ctx->thresholds[i] = - ctx->oldest + (ctx->newest - ctx->oldest) * i / MAXCOLOUR; + ctx->oldest + (ctx->newest - ctx->oldest) * i / (MAXCOLOUR-1); + } + for (i = 0; i <= MAXCOLOUR; i++) { + char buf[80]; + + if (i == 0) { + strcpy(buf, "< "); + round_and_format_age(ctx, ctx->thresholds[0], buf+5, 0); + } else if (i == MAXCOLOUR) { + strcpy(buf, "> "); + round_and_format_age(ctx, ctx->thresholds[MAXCOLOUR-1], buf+5, 0); + } else { + unsigned long long midrange = + (ctx->thresholds[i-1] + ctx->thresholds[i]) / 2; + round_and_format_age(ctx, midrange, buf, 0); + } + + ctx->titletexts[i] = dupstr(buf); } htprintf(ctx, "

Key to colour coding (mouse over for more detail):\n"); htprintf(ctx, "

totalsize = fetch_size(t, path, ULLONG_MAX); + get_indices(t, path, &xi1, &xi2); + ctx->totalsize = fetch_size(t, xi1, xi2, ULLONG_MAX); /* * Generate a report line for the whole subdirectory. -- 2.11.0