Vim me intrometer só para explicar o resultado “inexato” da system.time()
. Na verdade, o problema é com a Sys.sleep()
! De acordo com a documentação (negritos meus):
There is no guarantee that the process will sleep for the whole of the specified interval (sleep might be interrupted), and it may well take slightly longer in real time to resume execution.
time
must be non-negative (and not NA
nor NaN
): Inf
is allowed (and might be appropriate if the intention is to wait indefinitely for an interrupt). The resolution of the time interval is system-dependent, but will normally be 20ms or better. (On modern Unix-alikes it will be better than 1ms.)
Ou seja, a Sys.sleep()
não garante que ela irá esperar exatamente o tempo que você pediu e a resolução dos intervalos de tempo gira em torno de 20ms. Note que o tempo decorrido pulou de 3s no primeiro exemplo para 3.02s no segundo, exatamente 20ms de diferença
Não é coincidência.
P.S.: Sobre a sua preocupação com milissegundos, @hal-delaserna, eu não acho que seja inteiramente equivocada. Normalmente não somos capazes de notar ganhos desse tamanho, mas os atrasos acumulam… Uma tarefa de 1 segundo repetida 1000 vezes totaliza quase 20 minutos; reduzir um programa de 1 segundo para 0.5 é pouco, mas de 20 minutos para 10 já é outra história.
Tem um vídeo curtinho na internet de uma palestra ministrada pela Grace Hopper, uma das grandes pioneiras da computação. Nele, ela mostra a diferença entre 1 microssegundo e 1 nanossegundo (respectivamente 1 mil e 1 milhão de vezes menos que 1 milissegundo) e sugere que todo programador tenha 1 microssegundo pendurado ao lado de seu computador. Eu ainda não tenho o meu, mas esse vídeo mudou minha perspectiva sobre quanto tempo jogamos fora ao fazer um programa ineficiente.