Прежде всего, ваш код запрашивает два разных тактовых сигнала (CLOCK_THREAD_CPUTIME_ID
для tstart
и CLOCK_PROCESS_CPUTIME_ID
для tend
), поэтому нет смысла сравнивать эти два значения. Во-вторых, вы смотрите только на поле tv_nsec
struct timespec
, возвращаемое clock_gettime()
, и ваша разница может быть неправильной, даже если запрашивать одни и те же часы оба раза. Кроме того, ваш компилятор может оптимизировать пустой for
l oop, но это невозможно сказать, не глядя на сгенерированный двоичный файл, однако я считаю, что это маловероятно, если вы не компилировали с -O1
или -O2
(см. здесь например, l oop исключается только с -O2
).
Кроме того, Windows вообще не совместим с POSIX, а MinGW может эмулировать только поведение clock_gettime()
до некоторой степени, поэтому я бы не стал доверять возвращению точных значений. Кажется, это нормально для mingw-w64 , который просматривает исходный код , но я не знаю, какую версию вы используете. Даже если объект struct timespec
описывает времена с наносекундным разрешением, доступное разрешение зависит от системы и может даже превышать 1 секунду. Возможно, вы захотите проверить, что говорит clock_getres()
.
Согласно проекту комитета N1570 (12 апреля 2011 г.) ISO / IEC 9899: 201x, не должен ли timespec_get()
взять на себя роль clock_gettime()
вместо этого?
Стандарт C не говорит что-либо о том, какая функция должна взять на себя роль какой Другой. Функция timespec_get()
определенно не имеет ту же семантику, что и clock_gettime()
. Функция timespec_get()
работает только по «календарному времени» (которое должно совпадать с CLOCK_REALTIME
при использовании clock_gettime()
).