clock() и CLOCKS_PER_SEC в OSX 10.7

У меня проблема с использованием clock() в OSX. Я просто хочу отображать время, прошедшее с момента запуска моей программы. Дело в том, что когда я делю структуру clock_t на CLOCKS_PER_SEC, я получаю странные результаты.

Запуск моей программы в течение 10 секунд отобразит 1.0. В моей системе для параметра CLOCKS_PER_SEC установлено значение 1 000 000.

Вот пример моего кода:

    //startTime = clock() at the start of the program
    //This is called in each program loop       
    elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC

Если я делаю elapsedTime * 10, я получаю точное значение в секундах. Я не сплю и не жду во время выполнения программы.

Любая помощь в понимании того, что происходит, будет очень признательна.

РЕДАКТИРОВАТЬ:

Хорошо, я исправил приведение, но это не меняет того факта, что если я запускаю программу на 10 секунд, я получаю 1,0, 1 секунда равна 0,1. Вот этого я не понимаю. Мои CLOCKS_PER_SEC похожи на CLOCKS_PER_TEN_SEC.


person Elendir    schedule 22.05.2013    source источник
comment
Что ты делаешь между двумя clock() звонками?   -  person Fred Larson    schedule 22.05.2013
comment
Просто нарисуйте простое изображение с помощью SFML. (без ограничения частоты кадров). Я также показываю elaspedTime для каждого кадра, и я вижу, что каждая секунда добавляет около 0,1 к elapsedTime.   -  person Elendir    schedule 22.05.2013
comment
Тогда, возможно, большая часть обработки выполняется графическим процессором и не учитывается clock().   -  person Fred Larson    schedule 22.05.2013
comment
Не думал об этом. Но я не знаю, как я могу это проверить. Я только что обнаружил, что в SFML есть класс Clock, я думаю, что буду придерживаться его, но все еще не понимаю, почему я получаю что-то довольно точное, умножая elapsedTime на 10.   -  person Elendir    schedule 22.05.2013


Ответы (3)


Я думаю, что ваш слепок находится не в том месте, поэтому вы получаете целочисленное деление. Попробуй это:

elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC;

РЕДАКТИРОВАТЬ:

Также обратите внимание, что в большинстве систем clock() измеряет процессорное время. Возможно, вы используете не так много процессорного времени, как думаете.

person Fred Larson    schedule 22.05.2013

переместите свой бросок внутрь первой скобки:

 elapsedTime = ((double)(clock() - startTime)/CLOCKS_PER_SEC)

Теперь clock() -startTime становится двойным, заставляя CLOCKS_PER_SEC также быть значением с плавающей запятой, и вы получаете результат с плавающей запятой. В противном случае это целочисленное деление, и вы получите только целочисленные результаты.

person Mats Petersson    schedule 22.05.2013

clock() с CLOCKS_PER_SEC не подходит для использования в Mac OS X. clock() возвращает время процессора в тиках, в то время как POSIX требует, чтобы CLOCKS_PER_SEC равнялось 1000000, как указано на странице справочных часов.

В моем случае, когда я столкнулся с этим, как и у вас, расчет отличается в десять раз. Итак, clock() работает со скоростью 100 000 тактов в секунду. В Windows я вижу 1000 часов в секунду. Но если вы проверите это, фактическое разрешение и точность могут быть намного хуже, чем это, поэтому clock() в целом не является хорошим решением. Для Mac OS X gettimeofday — гораздо лучшее решение. Я также полагаю, что std::chrono - хорошее решение, и он должен быть лучшим кросс-платформенным выбором, но я еще не пробовал.

person Nigel Redmon    schedule 06.09.2019
comment
Если вы решите попробовать chrono, вот видеоруководство, которое поможет вам начать работу: youtube.com/watch ?v=P32hvk8b13M :-) Однако chrono будет измерять только прошедшее время, а не процессорное время, как это делает clock(). - person Howard Hinnant; 07.09.2019
comment
Да, в моем случае меня интересует только прошедшее время с точностью примерно до миллисекунды. И вы правы, я не заметил, что хотя clock() в Windows определяется как время настенных часов, версия unix - это процессорное время. (Я с самого начала использовал gettimeofday на стороне Mac, но перешел к clock() для сборок Windows — я просто экспериментировал, чтобы посмотреть, смогу ли я использовать clock() и избежать незначительных уродств условной компиляции.) Суть в часах. () очень грубо работает на Windows, а на Mac это неправильно. Очевидно, что хроно — лучший кроссплатформенный выбор. - person Nigel Redmon; 08.09.2019
comment
FWIW, однострочник для текущего времени в миллисекундах (#include ‹chrono›): std::chrono::duration_cast‹std::chrono::milliseconds›(std::chrono::steady_clock::now(). time_since_epoch()).count(); - person Nigel Redmon; 08.09.2019