Какое время измеряется "пользователем" и "системой" в выводе R system.time (exp)?

92

Я использую system.time(expression)для измерения времени выполнения функции R.

Вывод, который я получаю для звонка

system.time(myfunction())

является:

    user  system elapsed   
  117.36    5.65  127.86

Что измеряют «пользователь» и «система»?

комфорт
источник
1
Для этого вопроса можно было бы использовать более подходящий заголовок - например, «Что измеряет время« пользователя »и« системы »?». Это сделало бы вопрос более ясным для людей, просматривающих список.
Sharpie

Ответы:

49

Это обсуждается в ?proc.time( system.time()возвращает объект класса "proc.time"):

Details:

     ‘proc.time’ returns five elements for backwards compatibility, but
     its ‘print’ method prints a named vector of length 3.  The first
     two entries are the total user and system CPU times of the current
     R process and any child processes on which it has waited, and the
     third entry is the ‘real’ elapsed time since the process was
     started.

....и

Value:

....

     The definition of ‘user’ and ‘system’ times is from your OS.
     Typically it is something like

     _The ‘user time’ is the CPU time charged for the execution of user
     instructions of the calling process. The ‘system time’ is the CPU
     time charged for execution by the system on behalf of the calling
     process._
Гэвин Симпсон
источник
45

Самое ясное объяснение разницы между прошедшим временем userи systemпрошедшим временем, которое я когда-либо читал, было дано Уильямом Данлэпом в [R-help] :

«Время ЦП пользователя» дает время ЦП, затраченное текущим процессом (т. Е. Текущим сеансом R), а «время ЦП системы» - время ЦП, затраченное ядром (операционной системой) от имени текущего процесса. Операционная система используется для таких вещей, как открытие файлов, выполнение ввода или вывода, запуск других процессов и просмотр системных часов: операции, которые включают ресурсы, которые должны совместно использоваться многими процессами.

Хотя ?proc.timeвозвращает что-то похожее, это описание было для меня намного проще для понимания.

Дароциг
источник
24

Вот несколько простых объяснений:

Истекшее время - это время, затрачиваемое на процессор (ы) для выражения.

Пользовательское время - время настенных часов. Время, которое испытал вы как пользователь.

Обычно оба времени относительно близки. Но они могут отличаться в некоторых других ситуациях. Например:

  • Если прошедшее время> пользовательского времени , это означает, что ЦП ожидает выполнения некоторых других операций (которые могут быть внешними).
  • Если прошедшее время <пользовательского времени , это означает, что ваша машина имеет несколько ядер и может их использовать.
Фадва
источник
18

Поскольку они в любом случае общие, из Википедии:

Термин «процессорное время пользователя» поначалу может вводить в заблуждение. Чтобы было ясно, общее время (реальное время ЦП) - это комбинация количества времени, которое ЦП тратит на выполнение некоторых действий для программы, и количества времени, которое ЦП тратит на выполнение системных вызовов ядра от имени программы. Когда программа проходит через массив, она накапливает время ЦП пользователя. И наоборот, когда программа выполняет системный вызов, такой как exec или fork, она накапливает время центрального процессора системы.

http://en.wikipedia.org/wiki/Time_(Unix)#User_Time_vs_System_Time

Manojlds
источник
2

Поскольку эти временные переменные определяются вашей ОС, вы можете получить информацию о том, как они рассчитываются, выполнив man timeв своей оболочке (в Unix):

... Эти статистические данные включают в себя (я) прошедшее реальное время между вызовом и завершением, (б) время , пользователем процессора (суммой из tms_utimeи tms_cutimeзначений в STRUCT ТМСЕ в качестве возвращенный раза (2)), и (III) системное время процессора (сумма значений tms_stimeи tms_cstimeзначений в STRUCT ТМС, возвращаемый раз (2)).

Определение упомянутых временных переменных можно найти здесь :

tms_utime Пользовательское процессорное время.

tms_stime Системное процессорное время.

tms_cutime Пользовательское процессорное время завершенных дочерних процессов.

tms_cstime Системное процессорное время завершенных дочерних процессов.

Разъяснение различий между пользовательским и системным временем описано в ответе Дароцига и в других местах на SO :

tms_utimeЭлементом является количество времени , затраченное на выполнение кода или кода в библиотеке C. tms_stimeЭлемент является количеством времени , потраченным в ядре исполняющего код от вашего имени.

Joelostblom
источник