void UTIL_waitForNextTick(void) { UTIL_time_t const clockStart = UTIL_getTime(); UTIL_time_t clockEnd; do { clockEnd = UTIL_getTime(); } while (UTIL_getSpanTimeNano(clockStart, clockEnd) == 0); }
void BMK_resetTimedFnState(BMK_timedFnState_t* timedFnState, unsigned total_ms, unsigned run_ms) { if (!total_ms) total_ms = 1 ; if (!run_ms) run_ms = 1; if (run_ms > total_ms) run_ms = total_ms; timedFnState->timeSpent_ns = 0; timedFnState->timeBudget_ns = (PTime)total_ms * TIMELOOP_NANOSEC / 1000; timedFnState->runBudget_ns = (PTime)run_ms * TIMELOOP_NANOSEC / 1000; timedFnState->fastestRun.nanoSecPerRun = (double)TIMELOOP_NANOSEC * 2000000000; /* hopefully large enough : must be larger than any potential measurement */ timedFnState->fastestRun.sumOfReturn = (size_t)(-1LL); timedFnState->nbLoops = 1; timedFnState->coolTime = UTIL_getTime(); }
/* note : time per loop can be reported as zero if run time < timer resolution */ BMK_runOutcome_t BMK_benchFunction(BMK_benchParams_t p, unsigned nbLoops) { size_t dstSize = 0; nbLoops += !nbLoops; /* minimum nbLoops is 1 */ /* init */ { size_t i; for(i = 0; i < p.blockCount; i++) { memset(p.dstBuffers[i], 0xE5, p.dstCapacities[i]); /* warm up and erase result buffer */ } } /* benchmark */ { UTIL_time_t const clockStart = UTIL_getTime(); unsigned loopNb, blockNb; if (p.initFn != NULL) p.initFn(p.initPayload); for (loopNb = 0; loopNb < nbLoops; loopNb++) { for (blockNb = 0; blockNb < p.blockCount; blockNb++) { size_t const res = p.benchFn(p.srcBuffers[blockNb], p.srcSizes[blockNb], p.dstBuffers[blockNb], p.dstCapacities[blockNb], p.benchPayload); if (loopNb == 0) { if (p.blockResults != NULL) p.blockResults[blockNb] = res; if ((p.errorFn != NULL) && (p.errorFn(res))) { RETURN_QUIET_ERROR(BMK_runOutcome_error(res), "Function benchmark failed on block %u (of size %u) with error %i", blockNb, (unsigned)p.srcSizes[blockNb], (int)res); } dstSize += res; } } } /* for (loopNb = 0; loopNb < nbLoops; loopNb++) */ { PTime const totalTime = UTIL_clockSpanNano(clockStart); BMK_runTime_t rt; rt.nanoSecPerRun = (double)totalTime / nbLoops; rt.sumOfReturn = dstSize; return BMK_setValid_runTime(rt); } } }
/* returns time span in microseconds */ U64 UTIL_clockSpanNano(UTIL_time_t clockStart ) { UTIL_time_t const clockEnd = UTIL_getTime(); return UTIL_getSpanTimeNano(clockStart, clockEnd); }