В Windows clock()
возвращает время в миллисекундах, но в этом Linux-устройстве, над которым я работаю, оно округляет его до ближайшей 1000, поэтому точность составляет только «второй» уровень, а не уровень миллисекунд.
Я нашел решение с Qt, используя QTime
класс, создавая экземпляр объекта и вызывая start()
его, а затем вызывая, elapsed()
чтобы узнать количество прошедших миллисекунд.
Мне повезло, потому что я работаю с Qt с самого начала, но мне хотелось бы решение, которое не полагается на сторонние библиотеки,
Нет стандартного способа сделать это?
ОБНОВИТЬ
Пожалуйста, не рекомендуйте Boost ..
Если Boost и Qt могут это сделать, конечно, это не волшебство, должно быть что-то стандартное, что они используют!
Ответы:
Вы можете использовать gettimeofday в начале и в конце вашего метода, а затем различать две возвращаемые структуры. Вы получите такую структуру:
РЕДАКТИРОВАТЬ: Как показывают два комментария ниже, clock_gettime (CLOCK_MONOTONIC) - гораздо лучший выбор, если он у вас есть, что в наши дни должно быть почти везде.
РЕДАКТИРОВАТЬ: кто-то еще прокомментировал, что вы также можете использовать современный C ++ с std :: chrono :: high_resolution_clock, но это не гарантирует монотонность. Вместо этого используйте stable_clock.
источник
CLOCK_MONOTONIC
он отлично подходит для того, чтобы избежать локальной корректировки системного времени.источник
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, могли бы вы обновить пример, изменяяstruct timeval
кstruct timespec
, иgettimeofday(&start, NULL)
дляclock_gettime(CLOCK_MONOTONIC, &start)
того , чтобы люди не столкнулись с проблемами?Обратите внимание, что
clock
время настенных часов не измеряется. Это означает, что если ваша программа занимает 5 секунд,clock
не обязательно будет измерять 5 секунд, но может быть больше (ваша программа может запускать несколько потоков и поэтому может потреблять больше ресурсов ЦП, чем в реальном времени) или меньше. Он измеряет приблизительное используемое время процессора . Чтобы увидеть разницу, рассмотрите этот кодОн выводит в моей системе
Потому что все, что мы делали, это спали и не использовали процессорное время! Однако с помощью
gettimeofday
мы получаем то, что хотим (?)Выходы в моей системе
Если вам нужна более высокая точность, но вы хотите получить процессорное время , вы можете рассмотреть возможность использования
getrusage
функции.источник
sleep()
- я уже думал задать вопрос (почему он работает нормально у всех, кроме меня ?!) , когда нашел ваш ответ.Я также рекомендую инструменты, предлагаемые Boost. Либо упомянутый таймер ускорения, либо взломайте что-то из Boost.DateTime, либо в песочнице есть новая предлагаемая библиотека - Boost.Chrono : эта последняя будет заменой таймера и будет включать:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
с typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
, фиксируя реальное время ЦП пользователя и ЦП системы.process_timer
, фиксируя истекшее реальное время, время ЦП пользователя и ЦП системы.run_timer
, удобная отчетность о | process_timer | полученные результаты.Вот источник списка функций
источник
Я написал
Timer
класс на основе ответа CTT . Его можно использовать следующим образом:Вот его реализация:
источник
Если вам не нужно, чтобы код переносился на старые юнисы, вы можете использовать clock_gettime (), который даст вам время в наносекундах (если ваш процессор поддерживает это разрешение). Это POSIX, но с 2001 года.
источник
clock () часто имеет довольно плохое разрешение. Если вы хотите измерять время на уровне миллисекунды, альтернативой является использование clock_gettime (), как описано в этом вопросе.
(Помните, что вам нужно связать с -lrt в Linux).
источник
С C ++ 11
std::chrono::high_resolution_clock
вы можете это сделать:Вывод:
Ссылка на демонстрацию: http://cpp.sh/2zdtu
источник
clock () не возвращает миллисекунды или секунды в Linux. Обычно clock () возвращает микросекунды в системе Linux. Правильный способ интерпретировать значение, возвращаемое функцией clock (), - разделить его на CLOCKS_PER_SEC, чтобы выяснить, сколько времени прошло.
источник
Это должно работать ... проверено на Mac ...
Ага ... прогони дважды и вычти ...
источник
В стандарте POSIX
clock
возвращаемое значение определяется в терминах символа CLOCKS_PER_SEC, и реализация может определять это любым удобным способом. В Linux мне повезло с этойtimes()
функцией.источник
gettimeofday - проблема в том, что могут быть более низкие значения, если вы измените свои аппаратные часы (например, с помощью NTP). Boost - недоступно для этого проекта clock () - обычно возвращает целое число 4 байта, что означает, что его низкая емкость и через некоторое время возвращает отрицательные числа.
Я предпочитаю создавать свой собственный класс и обновлять его каждые 10 миллисекунд, так что этот способ более гибкий, и я даже могу улучшить его, чтобы иметь подписчиков.
чтобы обновить его, я использую setitimer:
Посмотрите на setitimer и ITIMER_VIRTUAL и ITIMER_REAL.
Не используйте функции будильника или будильника, у вас будет низкая точность, когда ваш процесс будет тяжелым.
источник
Я предпочитаю библиотеку Boost Timer из- за ее простоты, но если вы не хотите использовать сторонние библиотеки, использование clock () кажется разумным.
источник
В качестве обновления появляется, что в windows clock () измеряет время настенных часов (с точностью CLOCKS_PER_SEC)
в то время как в Linux он измеряет время ЦП по ядрам, используемым текущим процессом
и (похоже, и как указано на исходном плакате) на самом деле с меньшей точностью, чем CLOCKS_PER_SEC, хотя, возможно, это зависит от конкретной версии Linux.
источник
Мне нравится метод Hola Soy без использования gettimeofday (). Это случилось со мной на работающем сервере, администратор изменил часовой пояс. Часы были обновлены, чтобы показывать то же (правильное) местное значение. Это привело к тому, что функции time () и gettimeofday () сместились на 2 часа, и все временные метки в некоторых сервисах застряли.
источник
Я написал
C++
класс, используяtimeb
.Функции участников:
Пример использования:
На моем компьютере выводится «19». Точность
msTimer
класса составляет порядка миллисекунд. В приведенном выше примере использованияfor
отслеживается общее время выполнения, занимаемое -loop. На этот раз операционная система включала и выключала контекст выполнения из-main()
за многозадачности.источник