В начале и в конце моей программы я использую clock (), чтобы выяснить, сколько времени уходит на выполнение моей программы. К сожалению, это, кажется, занимает вдвое меньше времени, чем это сообщает. Я дважды проверил это командой «time».
Моя программа сообщает:
Завершено в 45,86 с
Отчеты команды времени:
реальный 0m22.837s
пользователь 0m45.735s
sys 0m0.152s
С помощью моего мобильного телефона, чтобы рассчитать время, он завершился за 23 секунды (иначе: «реальное» время). «Пользовательское» время — это сумма всех потоков, что имеет смысл, так как я использую OpenMP. (Вы можете прочитать об этом здесь: Что означают «реальный», «пользователь» и «sys» в выводе времени (1)?)
Итак, почему clock () сообщает о «пользовательском» времени, а не «реальном» времени? Есть ли другая функция, которую я должен использовать, чтобы вычислить, как долго работает моя программа?
В качестве примечания, часы Windows () работают как положено и выдают отчеты в «реальном» времени.
пользователь 0m45.735s
clock()
измеряет процессорное время используемый процесс (настолько хорошо, насколько это возможно) согласно 7.27.2.1
Функция часов возвращает наилучшее приближение реализации к времени процессора, используемому программой с начала определенной эпохой реализации, связанной только с вызовом программы.
а не настенные часы. таким образом clock()
сообщая время, близкое к user
время, которое time
Отчеты нормальные и соответствуют стандартам.
Чтобы измерить прошедшее время, если вы можете предположить POSIX, используя clock_gettime
это наверное лучший вариант, стандартная функция time()
может также использоваться для этого, но не очень мелкозернистый.
Я бы предложил clock_gettime
с помощью CLOCK_MONOTONIC
за часы.
В зависимости от вашей конкретной системы, это должно давать разрешение около микросекунды или лучше, и это не будет делать забавные вещи, если (например) кто-то установит системное время во время работы вашей программы.
Я хотел бы предложить, чтобы для тестирования производительности внутри приложений OpenMP вы использовали портативную функцию синхронизации OpenMP omp_get_wtime()
, который возвращает double
значение с секундами с некоторой неопределенной точки в прошлом. Вызовите его дважды и вычтите возвращаемые значения, чтобы получить истекшее время. Вы можете узнать, насколько точны измерения времени, позвонив omp_get_wtick()
, Возвращает double
значение разрешения таймера — значения ближе к 0.0
указать более точные таймеры.