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