/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * * Copyright (C) 2006-2007 Adam Gashlin (hcs) * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ /* a fun simple elapsed time profiler */ #if defined(SPC_PROFILE) && defined(USEC_TIMER) #define CREATE_TIMER(name) static uint32_t spc_timer_##name##_start,\ spc_timer_##name##_total #define ENTER_TIMER(name) spc_timer_##name##_start=USEC_TIMER #define EXIT_TIMER(name) spc_timer_##name##_total+=\ (USEC_TIMER-spc_timer_##name##_start) #define READ_TIMER(name) (spc_timer_##name##_total) #define RESET_TIMER(name) spc_timer_##name##_total=0 #define PRINT_TIMER_PCT(bname,tname,nstr) ci->fdprintf( \ logfd,"%10ld ",READ_TIMER(bname));\ ci->fdprintf(logfd,"(%3d%%) " nstr "\t",\ ((uint64_t)READ_TIMER(bname))*100/READ_TIMER(tname)) CREATE_TIMER(total); CREATE_TIMER(render); #if 0 CREATE_TIMER(cpu); CREATE_TIMER(dsp); CREATE_TIMER(dsp_pregen); CREATE_TIMER(dsp_gen); CREATE_TIMER(dsp_mix); #endif static void reset_profile_timers(void) { RESET_TIMER(total); RESET_TIMER(render); #if 0 RESET_TIMER(cpu); RESET_TIMER(dsp); RESET_TIMER(dsp_pregen); RESET_TIMER(dsp_gen); RESET_TIMER(dsp_mix); #endif } static int logfd=-1; static void print_timers(char * path) { logfd = ci->open("/spclog.txt",O_WRONLY|O_CREAT|O_APPEND); ci->fdprintf(logfd,"%s:\t",path); ci->fdprintf(logfd,"%10ld total\t",READ_TIMER(total)); PRINT_TIMER_PCT(render,total,"render"); #if 0 PRINT_TIMER_PCT(cpu,total,"CPU"); PRINT_TIMER_PCT(dsp,total,"DSP"); ci->fdprintf(logfd,"("); PRINT_TIMER_PCT(dsp_pregen,dsp,"pregen"); PRINT_TIMER_PCT(dsp_gen,dsp,"gen"); PRINT_TIMER_PCT(dsp_mix,dsp,"mix"); #endif ci->fdprintf(logfd,"\n"); ci->close(logfd); logfd=-1; } #else #define CREATE_TIMER(name) #define ENTER_TIMER(name) #define EXIT_TIMER(name) #define READ_TIMER(name) #define RESET_TIMER(name) #define print_timers(path) #define reset_profile_timers() #endif