Q: Как реализовать задержку или определить время реакции пользователя,
чтобы погрешность была меньше секунды?
A: У этой задачи нет, к несчастью, нет мобильных решений. Unix V7 и ее производные имели весьма полезную функцию ftime() c точностью до миллисекунды, но она исчезла в System V и Posix. Поищите такие функции: nap(), setitimer(), msleep(), usleep(), clock(), и gettimeofday(). Вызовы select() и poll() (если эти функции доступны) могут быть добавлены к сервисным функциям для создания простых задержек. В системе MS-DOS возможно перепрограммирование системного таймера и прерываний таймера.
> туплю не по-детски :) > хочу узнать время работы блока > делаю так
Предложу свой механизм:
А для начала правило: все зависит от ОС. Поясню - некоторые ОС не дадут прямой доступ к таймеру, а в некоторых все уже реализовано, только эти функции не стандартизированы в С.
Дажа два варианта:
Первый - в <time.h> есть описание функции clock() и определение CLK_TCK, который определяет дискретность измерения времени функцией clock(). возможны "подводные камни": В некоторых реализациях С единица времени 1/18.2, в некоторых 1/50, в некоторых 1/100, в некоторых 1/1000 секунды. Причем замечено что там, где 1/1000 или что-то в этом духе, там само возвращаемое значение может меняться с бОльшей дискретностью, чем "1".
Второй - можно воспользоваться счетчиком тактов (только для пентиумов, их клонов и выше). На гигагерцовом процессоре время можно измерять с точностью до наносекунд. А в Вашем случае можно и отойти от времени, поскольку для вашей задачи вполне может хватить самого счетчика тактов.
С таймером лучше не связываться, хотя он "тикает" с частотой чуть больше мегагерца (точность - микросекунды).
> time_t t1,t2; > > time(&t1); > > блок кода > > time(&t2); > printf("%f seconds",difftime(t2,t1)); > но время получаем в секундах а мне бы еще и миллисекунды > туда же > как сделать?
[C++] Тебе для отладки производительности, или действительно нужны миллисекунды? Платформа какая? Intel?03.12.04 12:02 Автор: HandleX <Александр М.> Статус: The Elderman
> туплю не по-детски :) > хочу узнать время работы блока > делаю так > > time_t t1,t2; > time(&t1); > блок кода > time(&t2); > printf("%f seconds",difftime(t2,t1)); > но время получаем в секундах а мне бы еще и миллисекунды > туда же > как сделать? Если под виндами, то может тебе понравится инструкция RDTSC? Пишет в EDX:EAX 64-битное значение внутреннего счётчика микропроцессора, увеличивающегося с каждым его тактом.
Кроме того, для виндов можно поюзать QueryPerformanceCounter и проч.
> Если под виндами, то может тебе понравится инструкция > RDTSC? Пишет в EDX:EAX 64-битное значение внутреннего > счётчика микропроцессора, увеличивающегося с каждым его > тактом. > > Кроме того, для виндов можно поюзать > QueryPerformanceCounter и проч. в миллисекундах и все.
платформа intel
хотелось бы остаться в рамках стандарта .
[C++] Вот выдержка из «Язык C в вопросах и ответах».03.12.04 12:30 Автор: HandleX <Александр М.> Статус: The Elderman
Q: Как реализовать задержку или определить время реакции пользователя,
чтобы погрешность была меньше секунды?
A: У этой задачи нет, к несчастью, нет мобильных решений. Unix V7 и ее производные имели весьма полезную функцию ftime() c точностью до миллисекунды, но она исчезла в System V и Posix. Поищите такие функции: nap(), setitimer(), msleep(), usleep(), clock(), и gettimeofday(). Вызовы select() и poll() (если эти функции доступны) могут быть добавлены к сервисным функциям для создания простых задержек. В системе MS-DOS возможно перепрограммирование системного таймера и прерываний таймера.
[C++] действительно так и есть03.12.04 12:53 Автор: vaborg <Israel Vaborg> Статус: Elderman
относительно ftime из mana
НАЙДЕННЫЕ ОШИБКИ
Эта функция устарела. Не используйте ее. В случаях, когда достаточно секунд, можно использовать
time(2); gettimeofday(2) позволяет работать с микросекундами; clock_gettime(3) позволяет работать с
наносекундами, однако пока что еще не очень широко распространена.
При работе с libc4 и libc5 поле millitm представляет для пользователя особый интерес. Но ранние
версии glibc2 работают некорректно и возвращает в этом поле нулевое значение; начиная с glibc 2.1.1
эта ошибка исправлена.
поэтому я про нее ничего и не спрашивал :)
через clock вполне хорошее решение - число тактов на секунду достаточно неплохо показывает то что надо.
все нашел! :)03.12.04 12:22 Автор: vaborg <Israel Vaborg> Статус: Elderman