Я хочу спросить, что кто-то из вас здесь знаком с этой функцией, как показано ниже в Interbench. Я хочу перенести это на платформу Windows, но продолжаю терпеть неудачу. Я могу получить только микросекундную точность, используя timeval вместо timespec. И в конце будет ошибка: деление на ноль и исключения нарушения доступаInterbench Benchmark Code
unsigned long get_usecs(struct timeval *myts)
{
if (clock_gettime(myts))
terminal_error("clock_gettime");
return (myts->tv_sec * 1000000 + myts->tv_usec);
}
void burn_loops(unsigned long loops)
{
unsigned long i;
/*
* We need some magic here to prevent the compiler from optimising
* this loop away. Otherwise trying to emulate a fixed cpu load
* with this loop will not work.
*/
for (i = 0; i < loops; i++)
_ReadWriteBarrier();
}
void calibrate_loop()
{
unsigned long long start_time, loops_per_msec, run_time = 0;
unsigned long loops;
struct timeval myts;
loops_per_msec = 100000;
redo:
/* Calibrate to within 1% accuracy */
while (run_time > 1010000 || run_time < 990000) {
loops = loops_per_msec;
start_time = get_usecs(&myts);
burn_loops(loops);
run_time = get_usecs(&myts) - start_time;
loops_per_msec = (1000000 * loops_per_msec/run_time ? run_time : loops_per_msec);
}
/* Rechecking after a pause increases reproducibility */
Sleep(1 * 1000);
loops = loops_per_msec;
start_time = get_usecs(&myts);
burn_loops(loops);
run_time = get_usecs(&myts) - start_time;
/* Tolerate 5% difference on checking */
if (run_time > 1050000 || run_time < 950000)
goto redo;
loops_per_ms = loops_per_msec;
}
Предоставленная функция в значительной степени зависит от функции 'get_usecs()' для вычисления времени, а также использует функции 'burn_loops()' и 'Sleep()' для некоторых своих действий. * Ни один из них не является стандартной функцией C или даже POSIX, поэтому вы не предоставили нам достаточно информации, чтобы сообщить соответствующий ответ. –
@JohnBollinger, я добавил в нужные функции. – Davy