Команда time позволяет просмотреть параметры производительности отдельной программы и ее дочерних процессов, работающих в синхронном режиме. Она показывает время, прошедшее с момента запуска до завершения работы программы, то есть фактическое время. Кроме того, она показывает, сколько времени процессор затратил на выполнение этой программы. Время процессора делится на две категории: пользовательское и системное. Пользовательское время - это время выполнения самой программы и всех вызовов библиотечных функций. Системное время - это время обработки вызванных программой (напрямую или косвенно) системных процедур и функций.
В сумме пользовательское и системное время дают общее время процессора, затраченное на выполнение программы. Сюда не входит обработка процессором компонентов ядра, которые могут быть запущены в ходе выполнения программы, но в настоящее время не запущены в данной нити. Например, захват страниц физической памяти для замещения страниц, полученных из списка свободных страниц при запуске программы, не учитывается при подсчете времени процессора, затраченного на выполнение программы.
В однопроцессорной системе ненулевая разность между фактическим и общим временем работы процессора, то есть
фактическое - (пользовательское + системное)
обусловлена влиянием всех факторов, которые могут замедлить обработку программы; кроме того, в него входят не учтенные ранее затраты времени на обработку самой программы. В системе SMP эту разницу можно вычислить по следующей формуле:
фактическое * число-процессоров - (пользовательское + системное)
Ниже в порядке убывания значимости перечислены некоторые из этих факторов:
В приведенном ниже примере программа откомпилирована с опцией -O3 для повышения скорости ее работы. Разность между фактическим временем выполнения программы и суммой пользовательского и системного времени в этом примере очень мала. Программе было предоставлено все запрошенное время - возможно, за счет других программ в системе.
# time looper фактическое 0m3.58s пользов. 0m3.16s сист. 0m0.04s
В следующем примере перед запуском той же программы ее приоритет был понижен путем добавления 10 к значению nice. Время выполнения программы увеличилось почти вдвое, однако при этом другие программы не были приостановлены:
# time nice -n 10 looper фактическое 0m6.54s пользов. 0m3.17s сист. 0m0.03s
Обратите внимание, что команда nice указана после команды time, а не наоборот. Если бы мы ввели команду
# nice -n 10 time looper
то была бы вызвана другая команда time (/usr/bin/time), отличающаяся меньшей точностью по сравнению с применяемой нами командой time, встроенной в оболочку ksh. Если команда time указана первой, то запускается встроенная версия, если явно не указано полное имя команды /usr/bin/time. Если команду time вызывает другая команда, то запускается программа /usr/bin/time.
При работе с командами time и timex следует обратить внимание на следующее:
В системе SMP фактическое время может быть меньше пользовательского времени процесса. Пользовательское время теперь представляет собой суммарное время, затраченное на выполнение нитей процесса всеми процессорами.
Если в однопроцессорной системе будет запущен процесс, состоящий из четырех нитей, то фактическое время будет больше пользовательского времени:
# time 4threadedprog фактическое 0m11.70s пользов. 0m11.09s сист. 0m0.08s
Если тот же процесс запустить в четырехпроцессорной системе, то фактическое время может составлять около 1/4 от пользовательского времени. Как видно из приведенного ниже примера, процесс с несколькими нитями распределяет нагрузку на несколько процессоров, за счет чего фактическое время выполнения уменьшается. Следовательно, скорость выполнения процесса в системе увеличилась.
# time 4threadedprog фактическое 0m3.40s пользов. 0m9.81s сист. 0m0.09s