C: использование clock() для измерения времени в многопоточных программах
Я всегда использовал clock(), чтобы измерить, сколько времени заняло мое приложение от начала до конца, as;
int main(int argc, char *argv[]) {
const clock_t START = clock();
// ...
const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}
Так как я начал использовать потоки POSIX, это, похоже, не сработало. Похоже, что clock() увеличивается в N раз быстрее с N потоков. Поскольку я не знаю, сколько потоков будет работать одновременно, этот подход не работает. Так как я могу измерить, сколько времени прошло?
2 ответа
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
как запасной вариант - но обратите внимание, что последний имеет недостаток, заключающийся в том, что он будет генерировать неверные результаты, если системное время изменяется во время работы вашего процесса.
Какое временное разрешение вам нужно? Вы можете использовать time() из time.h для второго разрешения. Если вам нужно более высокое разрешение, вы можете использовать что-то более системное. Смотрите функцию таймера, чтобы указать время в нано секундах, используя C++