From 2e94c606b83cd17ab449ee666cb16dae68268669 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 7 Dec 2009 01:05:31 +0000 Subject: [PATCH] Increase profiling timers' sliding mean accuracy. --- caca/caca_internals.h | 5 +++-- caca/caca_prof.h | 16 ++++++++-------- caca/prof.c | 12 ++---------- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/caca/caca_internals.h b/caca/caca_internals.h index 03a154a..a4952db 100644 --- a/caca/caca_internals.h +++ b/caca/caca_internals.h @@ -24,7 +24,7 @@ typedef struct caca_privevent caca_privevent_t; typedef struct caca_figfont caca_figfont_t; #if !defined(_DOXYGEN_SKIP_ME) -# define STAT_VALUES 20 +# define STAT_VALUES 32 # define EVENTBUF_LEN 10 # define MAX_DIRTY_COUNT 8 #endif @@ -148,8 +148,9 @@ struct caca_timer /* Statistic structure for profiling */ struct caca_stat { + int itable[STAT_VALUES]; + int64_t imean; char *name; - int imean, itable[STAT_VALUES]; }; /* Private event structure */ diff --git a/caca/caca_prof.h b/caca/caca_prof.h index 5129997..f75b87c 100644 --- a/caca/caca_prof.h +++ b/caca/caca_prof.h @@ -21,15 +21,15 @@ #if defined PROF && !defined __KERNEL__ # define PROFILING_VARS -# define STAT_IADD(s, n) \ +# define STAT_IADD(_s, _n) \ do \ { \ - struct caca_stat *ss = s; \ - int ii, nn = n; \ - for (ii = STAT_VALUES - 1; ii > 0; ii--) \ - ss->itable[ii] = ss->itable[ii - 1]; \ - ss->itable[0] = nn; \ - ss->imean = ((int64_t)ss->imean * 15 + nn) / 16; \ + struct caca_stat *s = _s; \ + int i, n = _n; \ + for (i = STAT_VALUES - 1; i > 0; i--) \ + s->itable[i] = s->itable[i - 1]; \ + s->itable[0] = n; \ + s->imean = (s->imean * 63 + (int64_t)n * 64 + 32) / 64; \ } \ while(0) @@ -38,7 +38,7 @@ #else # define PROFILING_VARS -# define STAT_IADD(s) do { } while(0) +# define STAT_IADD(_s, _n) do { } while(0) # define START_PROF(obj, fn) do { } while(0) # define STOP_PROF(obj, fn) do { } while(0) #endif diff --git a/caca/prof.c b/caca/prof.c index 1471573..1b12607 100644 --- a/caca/prof.c +++ b/caca/prof.c @@ -45,18 +45,10 @@ void _caca_dump_stats(void) for (j = 0; j < STAT_VALUES; j++) total += stats[i]->itable[j]; - fprintf(stderr, " %s: last %i mean %i sliding mean %i\n", + fprintf(stderr, " %s: last %i sliding mean %i smoothed mean %i\n", stats[i]->name, stats[i]->itable[0], (int)((total + STAT_VALUES / 2) / STAT_VALUES), - stats[i]->imean); -/*fprintf(stderr, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i\n", -stats[i]->itable[0], stats[i]->itable[1], stats[i]->itable[2], -stats[i]->itable[3], stats[i]->itable[4], stats[i]->itable[5], -stats[i]->itable[6], stats[i]->itable[7], stats[i]->itable[8], -stats[i]->itable[9], stats[i]->itable[10], stats[i]->itable[11], -stats[i]->itable[12], stats[i]->itable[13], stats[i]->itable[14], -stats[i]->itable[15], stats[i]->itable[16], stats[i]->itable[17], -stats[i]->itable[18], stats[i]->itable[19]);*/ + (int)(stats[i]->imean / 64)); } fprintf(stderr, "** %i counters dumped **\n", nstats);