clock()
измеряет время процессора, используемое вашим процессом, а не время настенных часов. Если у вас одновременно запущено несколько потоков, очевидно, что вы можете сжечь процессорное время гораздо быстрее.
Если вы хотите узнать время выполнения настенных часов, вам нужно использовать соответствующую функцию. Единственный в ANSI C - time()
, разрешение которого обычно составляет всего 1 секунду.
Однако, как вы сказали, вы используете POSIX, это означает, что вы можете использовать clock_gettime()
, определенный в time.h
. Для этого лучше всего использовать часы CLOCK_MONOTONIC
:
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
/* ... */
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;
(Обратите внимание, что я тщательно вычислил elapsed
, чтобы не потерять точность при очень коротких интервалах).
Если ваша ОС не предоставляет CLOCK_MONOTONIC
(который вы можете проверить во время выполнения с помощью sysconf(_SC_MONOTONIC_CLOCK)
), тогда вы можете использовать CLOCK_REALTIME
в качестве запасного варианта - но учтите, что у последней есть недостаток, заключающийся в том, что она генерирует некорректно результаты, если системное время изменяется во время работы вашего процесса.