2013-07-24 4 views
0

Я измеряю время процессора и время на стене алгоритмов сортировки на linux. Im используя getrusage для измерения времени процессора и clock_gettime CLOCK_MONOTONIC, чтобы получить время на стене. Хотя я заметил, что время процессора больше времени на стене - это правильно? Я всегда думал, что время процессора должно быть меньше времени на стене. Мой пример результаты:Бенчмаркинг - время процессора больше времени на стене?

3.000187 seconds [CPU] 
3.000001 seconds [WALL] 
+0

Сколько процессоров задействовано? –

+0

@ DanPichelman: 'cat/proc/cpuinfo | процессор grep | wc -l' дает мне 2 – mazix

+0

Но ваш код многопоточный/многопроцессорный? –

ответ

4

Если вычисление требует двух секунд процессорного времени, а затем два процессора может (в идеале) завершить его в течение одной секунды. Следовательно, двухпроцессорная система имеет два CPU секунд для каждой настенной секундой секунд. Даже если вы не используете многопоточность в своем процессе, библиотека, которую вы используете, или операционная система может использовать несколько процессоров для выполнения работы для вашего процесса.

Кроме того, некоторые из них являются приблизительными. Система может отслеживать время процессора в небольшом блоке, например микросекундах с целью аргументации, и заряжать процесс на микросекунду в любое время, когда процесс получает не менее половины микросекунды процессорного времени. (Который должен быть уроком для всех людей, которые отвечают на вопросы с плавающей точкой, с рекомендациями использовать целочисленную арифметику, чтобы избежать ошибок округления. Вся дискретная арифметика может иметь ошибки округления.)

1

В зависимости от аргумента, который вы используете, getrusage может вернуться сумма времени процессора для всех потоков в вашем процессе. Если у вас более одного потока, это может привести к тому, что время процессора будет выше, чем настенные часы.

Кроме того, в то время как структура результатов хранит значения в микросекундах, фактическая точность может быть намного ниже, а значит, и небольшое несоответствие.

+0

Я использую его вот так: 'getrusage (RUSAGE_SELF, & rus)' и имеет только один поток: ('int main() {// ...} ') – mazix

+0

Тогда, вероятно, из-за ограниченной точности' getrusage'. Вы можете попробовать запустить программу несколько раз, чтобы увидеть, как изменяются оба значения. – Benawii

Смежные вопросы