При использовании следующего примера кода значение tv_nsec, я полагаю, зацикливается, потому что оно onlyи long
;
#include <iostream>
using namespace std;
#include <time.h>
int main(int argc, char *argv[]) {
timespec time1, time2;
timespec timens = {0};
timens.tv_sec = 1;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
nanosleep(&timens, (struct timespec *)NULL);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout << time1.tv_nsec << " : " << time2.tv_nsec << endl;
cout << (time2.tv_nsec-time1.tv_nsec) << endl;
return 0;
}
$ ./microtime
2754095 : 2766801
12706
Разница между начальным и конечным временем составляет 12706 нс (12,7 мкс), 12 мкс не требовалось, чтобы заснуть на 1 секунду, я разумнов этом уверен! , имеет ли tv_nsec цикл? Предполагая, что это singed long
, чтобы дать меньший диапазон положительных значений (от 0 до 2147483647) вместо unsigned long
(от 0 до 4294967295), 2147483647 наносекунд по-прежнему чуть больше 2 полных секунд!
Если я изменю код на следующий, я все равно получу кажущийся неверным вывод:
timens.tv_sec = 0;
timens.tv_nsec = 100000;
$ ./microtime
2743552 : 2754327
10775
Продолжительность сна была установлена на 100 000 нс, но, согласно этому выводу, программа спала на 10 000 нс. Я знаю, что это небольшой промежуток времени, но я пытаюсь показать здесь, что будь то долгое время, например, 1 секунда, или короткое время, например 100 мкс, кажется, что здесь нет точности или где-либо еще. между этими значениями. Я что-то делаю не так, я как-то неправильно это реализовал? Почему я не могу получить фактическую продолжительность события между вызовами clock_gettime()?
Большое спасибо за ваше время.
Обновление
@Oli; Я могу проверить ваше предложение с помощью следующего кода, но он не работает:
int main(int argc, char *argv[]) {
timespec time1, time2;
timespec timens = {0};
timens.tv_sec = 1;
timens.tv_nsec = 0;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
nanosleep(&timens, (struct timespec *)NULL);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout <<time1.tv_sec<<"s:"<<time1.tv_nsec<<"ns : "<<
time2.tv_sec<<"s:"<<time2.tv_nsec<<"ns"<<endl;
cout <<(time2.tv_nsec-time1.tv_nsec)<<endl;
return 0;
}
$ ./microtime
0s:2801478ns : 0s:2813732ns
12254