O que são tempos de 'usuário' e 'sistema' medidos na saída de R system.time (exp)?

88

Estou usando system.time(expression)para medir o tempo de execução de uma função R.

A saída que recebo para a chamada

system.time(myfunction())

é:

    user  system elapsed   
  117.36    5.65  127.86

O que 'usuário' e 'sistema' medem?

cfort
fonte
Esta pergunta poderia ter um título melhor - como "O que medem os tempos do 'usuário' e do 'sistema'?". Isso tornaria a questão mais clara para as pessoas que navegam na lista.
Sharpie

Respostas:

46

Isso é discutido em ?proc.time( system.time()retorna um objeto de classe "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.

....e

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._
Gavin Simpson
fonte
43

A explicação mais clara que eu já li sobre a diferença entre usere systemtempo decorrido foi fornecida por William Dunlap em [R-ajuda] :

"Tempo de CPU do usuário" fornece o tempo de CPU gasto pelo processo atual (ou seja, a sessão R atual) e "tempo de CPU do sistema" fornece o tempo de CPU gasto pelo kernel (o sistema operacional) em nome do processo atual. O sistema operacional é usado para coisas como abrir arquivos, fazer entrada ou saída, iniciar outros processos e olhar o relógio do sistema: operações que envolvem recursos que muitos processos devem compartilhar.

Apesar ?proc.time retorne algo semelhante, essa descrição foi muito mais fácil de entender para mim.

Daroczig
fonte
22

Aqui estão algumas explicações simples:

Tempo decorrido é o tempo cobrado da (s) CPU (s) pela expressão.

A hora do usuário é a hora do relógio de parede. O tempo que você experimentou como usuário.

Normalmente, os dois momentos são relativamente próximos. Mas eles podem variar em algumas outras situações. Por exemplo:

  • Se o tempo decorrido> o tempo do usuário , significa que a CPU está aguardando que outras operações (podem ser externas) sejam realizadas.
  • Se o tempo decorrido <tempo do usuário , isso significa que sua máquina tem vários núcleos e é capaz de usá-los
Fadwa
fonte
17

Já que eles são genéricos de qualquer maneira, da Wikipedia:

O termo 'tempo de CPU do usuário' pode ser um pouco enganador no início. Para ser claro, o tempo total (tempo real da CPU) é a combinação da quantidade de tempo que a CPU gasta executando alguma ação para um programa e a quantidade de tempo que a CPU gasta executando chamadas do sistema para o kernel em nome do programa. Quando um programa percorre um array, ele está acumulando tempo de CPU do usuário. Por outro lado, quando um programa executa uma chamada de sistema, como exec ou fork, ele está acumulando tempo de CPU do sistema.

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

manojlds
fonte
2

Como essas variáveis ​​de tempo são definidas por seu sistema operacional, você pode recuperar informações sobre como são calculadas executando man timeem seu shell (no Unix):

... Essas estatísticas consistem em (i) o tempo real decorrido entre a chamada e o término, (ii) o tempo de CPU do usuário (a soma dos valores tms_utimee tms_cutimeem uma estrutura tms conforme retornado por times (2)) e (iii) o tempo de CPU do sistema (a soma dos valores tms_stimee tms_cstimeem uma estrutura tms conforme retornado por times (2)).

A definição das variáveis ​​de tempo mencionadas pode ser encontrada aqui :

tms_utime Tempo de CPU do usuário.

tms_stime Tempo de CPU do sistema.

tms_cutime Tempo de CPU do usuário de processos filho encerrados.

tms_cstime Tempo de CPU do sistema de processos filho encerrados.

Um esclarecimento das diferenças entre o tempo do usuário e do sistema é descrito na resposta de daroczig e em outras partes do SO :

O tms_utimeelemento é a quantidade de tempo gasto na execução de seu código ou o código na biblioteca C. O tms_stimeelemento é a quantidade de tempo gasto no kernel executando o código em seu nome.

joelostblom
fonte