xref: /netbsd-src/external/bsd/jemalloc.old/dist/test/src/timer.c (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
1*8e33eff8Schristos #include "test/jemalloc_test.h"
2*8e33eff8Schristos 
3*8e33eff8Schristos void
4*8e33eff8Schristos timer_start(timedelta_t *timer) {
5*8e33eff8Schristos 	nstime_init(&timer->t0, 0);
6*8e33eff8Schristos 	nstime_update(&timer->t0);
7*8e33eff8Schristos }
8*8e33eff8Schristos 
9*8e33eff8Schristos void
10*8e33eff8Schristos timer_stop(timedelta_t *timer) {
11*8e33eff8Schristos 	nstime_copy(&timer->t1, &timer->t0);
12*8e33eff8Schristos 	nstime_update(&timer->t1);
13*8e33eff8Schristos }
14*8e33eff8Schristos 
15*8e33eff8Schristos uint64_t
16*8e33eff8Schristos timer_usec(const timedelta_t *timer) {
17*8e33eff8Schristos 	nstime_t delta;
18*8e33eff8Schristos 
19*8e33eff8Schristos 	nstime_copy(&delta, &timer->t1);
20*8e33eff8Schristos 	nstime_subtract(&delta, &timer->t0);
21*8e33eff8Schristos 	return nstime_ns(&delta) / 1000;
22*8e33eff8Schristos }
23*8e33eff8Schristos 
24*8e33eff8Schristos void
25*8e33eff8Schristos timer_ratio(timedelta_t *a, timedelta_t *b, char *buf, size_t buflen) {
26*8e33eff8Schristos 	uint64_t t0 = timer_usec(a);
27*8e33eff8Schristos 	uint64_t t1 = timer_usec(b);
28*8e33eff8Schristos 	uint64_t mult;
29*8e33eff8Schristos 	size_t i = 0;
30*8e33eff8Schristos 	size_t j, n;
31*8e33eff8Schristos 
32*8e33eff8Schristos 	/* Whole. */
33*8e33eff8Schristos 	n = malloc_snprintf(&buf[i], buflen-i, "%"FMTu64, t0 / t1);
34*8e33eff8Schristos 	i += n;
35*8e33eff8Schristos 	if (i >= buflen) {
36*8e33eff8Schristos 		return;
37*8e33eff8Schristos 	}
38*8e33eff8Schristos 	mult = 1;
39*8e33eff8Schristos 	for (j = 0; j < n; j++) {
40*8e33eff8Schristos 		mult *= 10;
41*8e33eff8Schristos 	}
42*8e33eff8Schristos 
43*8e33eff8Schristos 	/* Decimal. */
44*8e33eff8Schristos 	n = malloc_snprintf(&buf[i], buflen-i, ".");
45*8e33eff8Schristos 	i += n;
46*8e33eff8Schristos 
47*8e33eff8Schristos 	/* Fraction. */
48*8e33eff8Schristos 	while (i < buflen-1) {
49*8e33eff8Schristos 		uint64_t round = (i+1 == buflen-1 && ((t0 * mult * 10 / t1) % 10
50*8e33eff8Schristos 		    >= 5)) ? 1 : 0;
51*8e33eff8Schristos 		n = malloc_snprintf(&buf[i], buflen-i,
52*8e33eff8Schristos 		    "%"FMTu64, (t0 * mult / t1) % 10 + round);
53*8e33eff8Schristos 		i += n;
54*8e33eff8Schristos 		mult *= 10;
55*8e33eff8Schristos 	}
56*8e33eff8Schristos }
57