Estou investigando o bash pela primeira vez e quero tentar testar algum código para comparar diferentes maneiras de atingir o mesmo objetivo. Como parte disso, descobri os métodos de tempo e tempo para registrar o tempo de execução do código. Para um script simples de uma linha criado por meio de:
echo "echo a script" > script
Eu recebo:
$ time bash ./script
a script
real 0m0.009s
user 0m0.006s
sys 0m0.002s
$ times bash ./script
0m0.082s 0m0.074s
0m0.019s 0m0.041s
$ /usr/bin/time bash ./script
a script
0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 3328maxresident)k
0inputs+0outputs (0major+148minor)pagefaults 0swaps
$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
$ type -a times
times is a shell builtin
$ which -a time
/usr/bin/time
/bin/time
bash -c help
me leva para:
$ help time
time: time [-p] pipeline
Report time consumed by pipeline's execution.
$ help times
times: times
Display process times.
E man time
me dá:
TIME(1)..........Manual de Comandos Gerais..........TIME(1)
Hora NAME - execute programas e resuma o uso de recursos do sistema
Os usuários do shell bash precisam usar um caminho explícito para executar o comando de tempo externo e não a variante interna do shell. No sistema onde o horário está instalado em /usr/bin, o primeiro exemplo seria
/usr/bin/time wc /etc/hosts
O manual de referência do bash descreve time
como uma palavra reservada que tem "um significado especial para o shell. Eles são usados para iniciar e terminar os comandos compostos do shell", enquanto times
é descrito como um comando interno do shell , "herdado do Bourne Shell. Esses comandos são implementados conforme especificado pelo padrão POSIX".
Além de uma linha no manual dizendo:
O uso de time como uma palavra reservada permite o tempo de componentes internos do shell, funções do shell e pipelines. Um comando de tempo externo não pode cronometrar isso facilmente.
Não consigo ver o raciocínio para três comandos muito semelhantes.
Qual devo usar para testar diferentes abordagens e otimizar meus scripts?
times
(construídas em)times
- conformehelp times
:Ênfase em “acumulado” e “para o shell e todos os seus processos filhos”. Não aceita nenhum argumento e não mede o tempo de execução de outro comando: imprime o tempo atual do usuário e do sistema gasto pelo shell e seus filhos para sua própria execução.
Por exemplo, se eu quisesse
printf
uma string vazia um milhão de vezes, o tempo que um shell levaria para executar todos esses comandos seria significativo (foco no primeiro campo das linhas comentadas):O que lhe confere uma finalidade completamente diferente de
time
(palavra reservada) e/usr/bin/time
(executável). Na maioria das vezes (trocadilho não intencional), em scripts, você usarátime
e/usr/bin/time
.time
(palavra reservada) //usr/bin/time
(executável)Como @terdon observa de forma crucial, um
time
"utilitário" implementado de tal forma que "pode ser acessado através da família de funções exec" deve estar presente em um sistema para ser compatível com POSIX 1 ; isso, por si só, justifica a presença de/usr/bin/time
além detime
.As diferenças mais significativas entre a palavra reservada e o executável são:
/usr/bin/time
. Observe também que, em geral, os executáveis integrados geralmente são executados mais rapidamente do que os executáveis externos.Portanto, na prática, pelo menos no Ubuntu, no que diz respeito a um único comando, a diferença entre os dois se resume principalmente ao formato em que a saída é impressa.
Usando a palavra reservada você tem pouca personalização de saída disponível (basicamente você pode imprimir usando o formato padrão e um formato compatível com POSIX), enquanto usando o executável você tem muito mais opções disponíveis (veja Recursos
man time
).