Como usar o comando time no Linux

Conteúdo

PC Linux com uma janela de terminal aberta

Você quer saber quanto tempo leva um processo e muito mais? El Linux time O comando retorna estatísticas de tempo, que fornece informações interessantes sobre os recursos usados ​​por seus programas.

o tempo tem muitos parentes

Existem muitas distribuições Linux e diferentes sistemas operacionais do tipo Unix. Cada um deles tem um shell de comando padrão. O shell padrão mais comum nas distribuições Linux modernas é o shell bash. Mas existem muitos outros, como Z shell (zsh) Y el Shell Korn (ksh).

Todas essas conchas incorporam seus próprios time comando, tanto como um Incorporado comando ou como um palavra reservada. Quando você escreve time em uma janela de terminal, o shell iráexecutar seu comando interno em vez de usar GNU time binário que é fornecido como parte de sua distribuição Linux.

Queremos usar a versão GNU do time porque tem mais opções e é mais flexível.

Que horas vai correr?

Você pode verificar qual versão será executada usando o type comando. type irá informá-lo se o shell irá lidar com suas instruções por conta própria, com suas rotinas internas, ou irá convertê-los para o binário GNU.

em uma janela de terminal digite a palavra type, um espaço e depois a palavra time e pressione Enter.

digite o tempo

tempo de gravação em uma janela de terminal bash

Podemos ver isso no shell bash time é uma palavra reservada. Isso significa que o Bash usará seutime rotinas padrão.

digite o tempo

escreva a hora em uma janela de terminal zsh

No shell Z (zsh) time é uma palavra reservada, então rotinas internas de shell serão usadas por padrão.

digite o tempo

digite o tempo em uma janela de shell korn

Na casca do Korn time é uma palavra-chave. Uma rotina interna será usada em vez do GNU time comando.

RELACIONADO: O que é ZSH e por que devo usá-lo em vez do Bash?

Executando o comando GNU time

Se o shell do seu sistema Linux tiver um time rotina terá que ser explícita se você quiser usar o GNU time trilhas. Você deve:

  • Forneça o caminho completo para o binário, O que /usr/bin/time. Execute o which time comando para encontrar este caminho.
  • Usar command time.
  • Use uma barra invertida como time.

a which time O comando nos dá o caminho para o binário.

Podemos testar isso usando /usr/bin/time como um comando para iniciar o binário GNU. Isso funciona. Recebemos uma resposta de time comando que nos diz que não fornecemos nenhum parâmetro de linha de comando para que funcione.

Digitando command time Também funciona, e obtemos as mesmas informações de uso de time. a command o comando diz ao shell para ignorar o seguinte comando para que seja processado fora do shell.

Usando um caractere antes do nome do comando é o mesmo que usar command antes do nome do comando.

A maneira mais fácil de ter certeza de que você está usando GNU time binário é usar a opção backslash.

Tempo
Tempo

time invocar o Concha versão do tempo. time use o time trilhas.

Usando o comando de tempo

Vamos medir alguns programas. Estamos usando dois programas chamados loop1 e loop2. Eles foram criados a partir de loop1.ce loop2.c. Eles não fazem nada útil além de demonstrar os efeitos de um tipo de ineficiência de codificação.

Este é o loop1.c. O comprimento de uma sequência dentro dos dois laços aninhados é necessário. O comprimento é obtido antecipadamente, fora dos dois loops aninhados.

#incluir "stdio.h"
#incluir "string.h"
#incluir "stdlib.h"

int principal (int argc, char* argv[])
{
 int i, j, Len, conde=0;
 char szString[]="como-geek-como-para-geek-como-para-geek-como-para-geek-como-para-geek-como-para-geek";

 // obter comprimento de corda uma vez, outside of loops
 len = strlen( szString );  

 para (j=0; j<500000; j++) {

 para (i=0; eu < Len; i ++ ) {

  E se (szString[eu] == '-')
    contagem++;
   }
 }

 printf("Contado %d hífensn", contar);

 saída (0);

} // fim do principal

Este é o loop2.c. O comprimento da corda é obtido repetidamente para cada ciclo do loop externo. Essa ineficiência deve ser refletida nos tempos.

#incluir "stdio.h"
#incluir "string.h"
#incluir "stdlib.h"

int principal (int argc, char* argv[])
{
 int i, j, conde=0;
 char szString[]="como-geek-como-para-geek-como-para-geek-como-para-geek-como-para-geek-como-para-geek";

 para (j=0; j<500000; j++) {

 // ficando comprimento de corda cada
 // time the loops trigger
 for (i=0; eu < strlen(szString); i ++ ) {

   E se (szString[eu] == '-')
    contagem++;
   }
 }

 printf("Contado %d hífensn", contar);

 saída (0);

} // fim do principal

Vamos ligar o loop1 programação e uso time para medir seu desempenho.

time ./loop1

Agora vamos fazer o mesmo para loop2.

time ./loop2

Isso nos deu dois conjuntos de resultados, mas eles estão em um formato realmente desagradável. Podemos fazer algo sobre isso mais tarde., mas vamos pegar algumas informações dos resultados.

Quando os programas são executados, existem dois modos de execução entre os quais eles se alternam. Estes são chamados modo de usuário e kernel do modo.

Em poucas palavras, um processo de modo de usuário não pode acessar diretamente o hardware de referência ou a memória fora de sua própria alocação. Para ter acesso a esses recursos, o processo deve fazer solicitações ao kernel. Se o kernel aprovar o pedido, o processo é executado no modo kernel até que o requisito seja satisfeito. A seguir, o processo volta a funcionar em modo de usuário.

Os resultados para loop1 diga-nos isso loop1 Passo 0,09 segundos no modo de usuário. Tempo zero gasto no modo kernel ou tempo no modo kernel é muito baixo para registrar uma vez que foi arredondado para baixo. O tempo total decorrido foi 0,1 segundos. loop1 recebeu uma média de 89% de tempo de CPU durante o tempo total decorrido.

O ineficiente loop2 O programa demorou três vezes mais para ser executado. Seu tempo total decorrido é 0,3 segundos. A duração do tempo de processamento no modo de usuário é 0,29 segundos. Nada é registrado no modo kernel. loop2 recebeu uma média de 96% Tempo de CPU durante a execução.

Formate a saída

Você pode personalizar a saída de time usando uma string de formato. A string de formato pode conter especificadores de texto e formato. A lista de especificadores de formato pode ser encontrado na página de manual por time. Cada um dos especificadores de formato representa uma informação.

Quando a string é impressa, os especificadores de formato são substituídos pelos valores reais que representam. Por exemplo, o especificador de formato para a porcentagem de CPU é a letra P . Para indicar para time que um especificador de formato não é apenas uma letra normal, adicione um sinal de porcentagem, O que %P . Vamos usá-lo em um exemplo.

a -f Opção (string de formato) se usa para indicar time que o que se segue é uma string de formato.

Nossa string de formato imprimirá os caracteres "Programa:”E o nome do programa (e quaisquer parâmetros de linha de comando que você passar para o programa). a %C O especificador de formato significa “Nome da linha de comando e argumentos do comando sendo cronometrado”. a n faz a saída passar para a próxima linha.

Existem muitos especificadores de formato e eles diferenciam maiúsculas de minúsculas, então certifique-se de inseri-los corretamente quando fizer isso sozinho.

A seguir, vamos imprimir os personagens “Tempo total:” seguido pelo valor do tempo total decorrido para esta execução do programa (representado por %E).

Nós usamos n para dar outra nova linha. A seguir, vamos imprimir os personagens “Caminho (s) do usuário”, seguido pelo valor do tempo de CPU gasto no modo de usuário, representado pelo %U.

Nós usamos n para dar outra nova linha. Desta vez, estamos nos preparando para o valor de tempo do kernel. Nós imprimimos os caracteres “Modo kernel (s)”, seguido pelo especificador de formato para o tempo de CPU gasto no modo kernel, o que é %S.

Finalmente, vamos imprimir os caracteres “nCPU: ”Para nos dar uma nova linha e título para este valor de dados. a %P O especificador de formato dará a porcentagem média de tempo de CPU usado pelo processo cronometrado.

Toda a string de formato está entre aspas. Poderíamos ter incluído alguns t caracteres para colocar tabulações na saída se formos exigentes quanto ao alinhamento de valores.

tempo -f "Programa: %CnTempo total: %Modo EnUser (s) %Modo UnKernel (s) %SnCPU: %P" ./loop1

Envie a saída para um arquivo

Para manter um registro dos tempos dos testes que você realizou, você pode enviar a saída de time para um arquivo. Para fazer isso, use o -o (Saída) opção. A saída do seu programa continuará a ser exibida na janela do terminal. É apenas a saída de time que é redirecionado para o arquivo.

Podemos executar o teste novamente e salvar a saída no test_results.txt arquivo como segue:

tempo -o test_results.txt -f "Programa: %CnTempo total: %Modo EnUser (s) %Modo UnKernel (s) %SnCPU: %P" ./loop1
cat test_results.txt

a loop1 A saída do programa é exibida na janela do terminal e os resultados de time Vou ao test_results.txt procedimentos.

Se você deseja capturar o próximo conjunto de resultados no mesmo arquivo, você deve usar o -a (Adicionar) opção como segue:

tempo -o test_results.txt -a -f "Programa: %CnTempo total: %Modo EnUser (s) %Modo UnKernel (s) %SnCPU: %P" ./loop2
cat test_results.txt

Agora deve estar claro por que usamos o %C especificador de formato para incluir o nome do programa na saída da string de formato.

E estamos sem tempo

Provavelmente mais útil para programadores e desenvolvedores ajustar seu código, a time O comando também é útil para quem deseja saber um pouco mais sobre o que acontece nos bastidores cada vez que inicia um programa.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.