mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2025-03-11 02:40:09 +01:00
(measure_init): Improve it so that we don't measure noise, such
as context-switches. (Logical change 1.191)
This commit is contained in:
parent
d73775b6cb
commit
fc7b49b983
1 changed files with 59 additions and 31 deletions
|
@ -39,7 +39,7 @@ static int maxlevel = 100;
|
||||||
|
|
||||||
#define MB (1024*1024)
|
#define MB (1024*1024)
|
||||||
|
|
||||||
static char big[128*MB];
|
static char big[512*MB];
|
||||||
|
|
||||||
static inline double
|
static inline double
|
||||||
gettime (void)
|
gettime (void)
|
||||||
|
@ -118,13 +118,14 @@ doit (const char *label)
|
||||||
}
|
}
|
||||||
|
|
||||||
static long
|
static long
|
||||||
sum (char *buf, size_t size)
|
sum (void *buf, size_t size)
|
||||||
{
|
{
|
||||||
long s = 0;
|
long s = 0;
|
||||||
|
char *cp = buf;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < size; ++i)
|
for (i = 0; i < size; i += 64)
|
||||||
s += *buf++;
|
s += *cp++;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,42 +133,69 @@ static void
|
||||||
measure_init (void)
|
measure_init (void)
|
||||||
{
|
{
|
||||||
# define N 1000
|
# define N 1000
|
||||||
double stop, start, getcontext_cold, getcontext_warm, init_cold, init_warm;
|
# define M 10
|
||||||
|
double stop, start, get_cold, get_warm, init_cold, init_warm, delta;
|
||||||
unw_cursor_t cursor[N];
|
unw_cursor_t cursor[N];
|
||||||
unw_context_t uc[N];
|
unw_context_t uc[N];
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
/* Ensure memory is paged in but not in the cache: */
|
/* Run each test M times and take the minimum to filter out noise
|
||||||
memset (cursor, 0, sizeof (cursor));
|
such dynamic linker resolving overhead, context-switches,
|
||||||
memset (uc, 0, sizeof (uc));
|
page-in, cache, and TLB effects. */
|
||||||
dummy = sum (big, sizeof (big));
|
|
||||||
|
|
||||||
start = gettime ();
|
get_cold = 1e99;
|
||||||
for (i = 0; i < N; ++i)
|
for (j = 0; j < M; ++j)
|
||||||
unw_getcontext (&uc[i]);
|
{
|
||||||
stop = gettime ();
|
dummy += sum (big, sizeof (big)); /* flush the cache */
|
||||||
getcontext_cold = (stop - start) / N;
|
|
||||||
|
|
||||||
start = gettime ();
|
start = gettime ();
|
||||||
for (i = 0; i < N; ++i)
|
for (i = 0; i < N; ++i)
|
||||||
unw_init_local (&cursor[i], &uc[i]);
|
unw_getcontext (&uc[i]);
|
||||||
stop = gettime ();
|
stop = gettime ();
|
||||||
init_cold = (stop - start) / N;
|
delta = (stop - start) / N;
|
||||||
|
if (delta < get_cold)
|
||||||
|
get_cold = delta;
|
||||||
|
}
|
||||||
|
//exit (0);
|
||||||
|
init_cold = 1e99;
|
||||||
|
for (j = 0; j < M; ++j)
|
||||||
|
{
|
||||||
|
dummy += sum (big, sizeof (big)); /* flush cache */
|
||||||
|
start = gettime ();
|
||||||
|
for (i = 0; i < N; ++i)
|
||||||
|
unw_init_local (&cursor[i], &uc[i]);
|
||||||
|
stop = gettime ();
|
||||||
|
delta = (stop - start) / N;
|
||||||
|
if (delta < init_cold)
|
||||||
|
init_cold = delta;
|
||||||
|
}
|
||||||
|
|
||||||
start = gettime ();
|
get_warm = 1e99;
|
||||||
for (i = 0; i < N; ++i)
|
for (j = 0; j < M; ++j)
|
||||||
unw_getcontext (&uc[0]);
|
{
|
||||||
stop = gettime ();
|
start = gettime ();
|
||||||
getcontext_warm = (stop - start) / N;
|
for (i = 0; i < N; ++i)
|
||||||
|
unw_getcontext (&uc[0]);
|
||||||
|
stop = gettime ();
|
||||||
|
delta = (stop - start) / N;
|
||||||
|
if (delta < get_warm)
|
||||||
|
get_warm = delta;
|
||||||
|
}
|
||||||
|
|
||||||
start = gettime ();
|
init_warm = 1e99;
|
||||||
for (i = 0; i < N; ++i)
|
for (j = 0; j < M; ++j)
|
||||||
unw_init_local (&cursor[0], &uc[0]);
|
{
|
||||||
stop = gettime ();
|
start = gettime ();
|
||||||
init_warm = (stop - start) / N;
|
for (i = 0; i < N; ++i)
|
||||||
|
unw_init_local (&cursor[0], &uc[0]);
|
||||||
|
stop = gettime ();
|
||||||
|
delta = (stop - start) / N;
|
||||||
|
if (delta < init_warm)
|
||||||
|
init_warm = delta;
|
||||||
|
}
|
||||||
|
|
||||||
printf ("unw_getcontext : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
|
printf ("unw_getcontext : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
|
||||||
1e9 * getcontext_cold, 1e9 * getcontext_warm);
|
1e9 * get_cold, 1e9 * get_warm);
|
||||||
printf ("unw_init_local : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
|
printf ("unw_init_local : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
|
||||||
1e9 * init_cold, 1e9 * init_warm);
|
1e9 * init_cold, 1e9 * init_warm);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue