From: Ben Gras Date: Sun, 15 May 2011 03:38:27 +0000 (+0200) Subject: - add feature to time a code block X-Git-Tag: v3.2.0~551 X-Git-Url: http://zhaoyanbai.com/repos/doc/roff.7.html?a=commitdiff_plain;h=c02833ced638995390f45c74fe869aef8ed1d9d5;p=minix.git - add feature to time a code block . also minor compile fixes for it --- diff --git a/common/include/timers.h b/common/include/timers.h index e88d5674a..5b714ad5c 100644 --- a/common/include/timers.h +++ b/common/include/timers.h @@ -16,7 +16,11 @@ #define _TIMERS_H #include + #include +#include +#include +#include struct timer; typedef void (*tmr_func_t)(struct timer *tp); @@ -59,5 +63,51 @@ _PROTOTYPE( void tmrs_exptimers, (timer_t **tmrs, clock_t now, clock_t *new_head _PROTOTYPE( clock_t tmrs_settimer, (timer_t **tmrs, timer_t *tp, clock_t exp_time, tmr_func_t watchdog, clock_t *new_head) ); +#define PRINT_STATS(cum_spenttime, cum_instances) { \ + if(ex64hi(cum_spenttime)) { printf(" ???\n"); } \ + printf("%s:%d,%lu,%lu,%lu,%d.%04d%%\n", \ + __FILE__, __LINE__, cum_instances, \ + div64u(cum_spenttime, cum_instances), \ + ex64lo(cum_spenttime), \ + perc/10000, perc%10000); \ + } + +#define RESET_STATS(starttime, cum_instances, cum_spenttime, cum_starttime) { \ + cum_instances = 0; \ + cum_starttime = starttime; \ + cum_spenttime = make64(0,0); \ +} + +#define TIME_BLOCK_VAR(timed_code_block, time_interval) do { \ + static u64_t _cum_spenttime, _cum_starttime; \ + static int _cum_instances; \ + u64_t _next_cum_spent, _starttime, _endtime, _dt, _cum_dt; \ + u32_t _dt_micros; \ + int perc; \ + read_tsc_64(&_starttime); \ + do { timed_code_block } while(0); \ + read_tsc_64(&_endtime); \ + _dt = sub64(_endtime, _starttime); \ + if(_cum_instances == 0) { \ + RESET_STATS(_starttime, _cum_instances, _cum_spenttime, _cum_starttime); \ + } \ + _next_cum_spent = add64(_cum_spenttime, _dt); \ + if(ex64hi(_next_cum_spent)) { \ + PRINT_STATS(_cum_spenttime, _cum_instances); \ + RESET_STATS(_starttime, _cum_instances, _cum_spenttime, _cum_starttime); \ + } \ + _cum_spenttime = add64(_cum_spenttime, _dt); \ + _cum_instances++; \ + _cum_dt = sub64(_endtime, _cum_starttime); \ + perc=ex64lo(div64(mul64(_cum_spenttime,make64(1000000,0)), _cum_dt)); \ + if(cmp64(_cum_dt, make64(0, 120)) > 0) { \ + PRINT_STATS(_cum_spenttime, _cum_instances); \ + RESET_STATS(_starttime, _cum_instances, _cum_spenttime, _cum_starttime); \ + } \ +} while(0) + +#define TIME_BLOCK(timed_code_block) TIME_BLOCK_VAR(timed_code_block, 100) +#define TIME_BLOCK_T(timed_code_block, t) TIME_BLOCK_VAR(timed_code_block, t) + #endif /* _TIMERS_H */ diff --git a/lib/libc/arch/i386/math/arch_compare.c b/lib/libc/arch/i386/math/arch_compare.c index 5127db3a9..db085db82 100644 --- a/lib/libc/arch/i386/math/arch_compare.c +++ b/lib/libc/arch/i386/math/arch_compare.c @@ -1,4 +1,5 @@ #include +#include #include #include "fpu_cw.h"