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?
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?
Respostas:
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._
A explicação mais clara que eu já li sobre a diferença entre user
e system
tempo 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.
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:
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
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 time
em 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_utime
etms_cutime
em uma estrutura tms conforme retornado por times (2)) e (iii) o tempo de CPU do sistema (a soma dos valorestms_stime
etms_cstime
em 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_utime
elemento é a quantidade de tempo gasto na execução de seu código ou o código na biblioteca C. Otms_stime
elemento é a quantidade de tempo gasto no kernel executando o código em seu nome.