Você quer saber quanto tempo leva um procedimento 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
Podemos ver isso no shell bash time
é uma palavra reservada. Isso significa que o Bash usará seutime
rotinas padrão.
digite o tempo
No shell Z (zsh) time
é uma palavra reservada, então rotinas internas de shell serão usadas por padrão.
digite o tempo
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 owhich 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 se certificar de que você está usando GNU time
binário é usar a opção barra invertida.
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 corda é necessário dentro dos dois loops aninhados. 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
programar y utilizar 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 nojento. 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.
Resumidamente, um procedimento no modo de usuário não pode acessar diretamente o hardware ou a memória de referência fora de sua própria alocação. Para ter acesso a esses recursos, o procedimento deve fazer solicitações ao kernel. Se o kernel aprovar o pedido, o procedimento é executado no modo kernel até que o requisito seja satisfeito. A seguir, o procedimento retorna à execução do 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% Tempo de CPU sobre 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. Como um 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) é usado 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, Portanto, certifique-se de inseri-los corretamente ao fazer 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
.
Por último, vamos imprimir os caracteres “n
CPU: ”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 procedimento 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, deve usar o -a
(Adicionar) opção do próximo caminho:
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 toda vez que inicia um programa..