Por que os tempos de execução do mesmo binário diferem em várias execuções
O principal problema aqui é o comportamento não-determinístico devido à maneira como a CPU funciona. As CPUs superescalares modernas podem executar várias instruções por vez ou alterar a ordem dos comandos a serem executados (execução fora de ordem). Em relação ao seu exemplo, também é possível que a otimização no uso do cache se aplique. A RAM tem várias magnitudes mais lentas que a própria CPU, e é por isso que o cache intensivo é usado. A segunda execução do seu binário pode ser executada no cache, consumindo, assim, menos ciclos de CPU (ciclos, a CPU teria esperado que os dados fossem recuperados da memória).
Sobre a diferença entre as estatísticas reais, de tempo de processo do usuário e do sistema
Uma dessas coisas não é como a outra. Real refere-se ao tempo decorrido real; Usuário e Sys referem-se ao tempo de CPU usado somente pelo processo.
-
Real é a hora do relógio de parede - o tempo do início ao fim da chamada. Isso é todo o tempo decorrido, incluindo as fatias de tempo usadas por outros processos e o tempo que o processo gasta bloqueado (por exemplo, se estiver aguardando a conclusão da E / S).
-
Usuário é a quantidade de tempo gasto na CPU no código do modo de usuário (fora do kernel) dentro do processo. Este é apenas o tempo real da CPU usado na execução do processo. Outros processos e tempo que o processo gasta bloqueado não contam para essa figura.
-
Sys é a quantidade de tempo de CPU gasto no kernel dentro do processo. Isso significa executar o tempo de CPU gasto em chamadas do sistema dentro do kernel, em oposição ao código da biblioteca, que ainda está em execução no espaço do usuário. Como 'usuário', este é apenas o tempo de CPU usado pelo processo. Veja abaixo uma breve descrição do modo kernel (também conhecido como modo 'supervisor') e o mecanismo de chamada do sistema.
User+Sys
informará quanto tempo de CPU real seu processo usou. Observe que isso ocorre em todas as CPUs, portanto, se o processo tiver vários segmentos, ele poderá exceder o tempo de relógio de parede informado por Real
. Observe que, na saída, esses números incluem o tempo User
e Sys
de todos os processos filhos (e seus descendentes), bem como quando poderiam ter sido coletados, por exemplo, por wait(2)
ou waitpid(2)
, embora as chamadas de sistema subjacentes retornem as estatísticas para o processo e seus filhos separadamente.