cronometrando a execução de um comando de origem

cronometrando a execução de um comando de origem

Estou tentando melhorar a execução dos meus dotfiles zsh e preciso cronometrar a execução dos meus subscripts. Eu tenho uma seção de código .zshrcparecida com esta:

typeset -U config_files
config_files=($DOTFILES/**/*.zsh)
for file in  ${(M)config_files}
do
    source file
done

O que eu gostaria de fazer é algo assim:

for file in  ${(M)config_files}
do
    \time -f %E source file
done

Mas, infelizmente, recebo este tipo de resposta:

time: cannot run source: No such file or directory

Onde eu estou errando?

Responder1

sourceé um comando interno, não externo, portanto, usar o externo timepara cronometrar não faz sentido. Faça um dos seguintes:

TIMEFMT=%E
for file in  ${(M)config_files}
do
    time (source file)
done

Ou:

for file in  ${(M)config_files}
do
    \time -f %E zsh -c 'source "$1"' zsh "$file"
done

Na antiga,o subshell é necessário porque:

Nota adicional: O tempo incorporado aplicado a qualquer construção executada no shell atual é ignorado silenciosamente. Portanto, embora seja sintaticamente correto colocar uma curva de abertura, um loop de repetição ou algo semelhante imediatamente após a palavra-chave time, você não obterá estatísticas de tempo. Em vez disso, você precisa usar parênteses para forçar um subshell, que é então cronometrado.

E no último caso, você está iniciando uma nova instância zsh para cada arquivo. Portanto, em ambos os casos, não há como cronometrar facilmente scripts dependentes (ou seja, onde um arquivo de configuração faz algo que é exigido ou de alguma forma afeta outro arquivo de configuração). Como alternativa, você pode salvar a saída timeapós cada fonte, o que fornecerá o tempo cumulativo:

TIMEFMT=%E
{time} 2> times
for file in  ${(M)config_files}
do
    source file
    {time} 2>> times
done

Então você pode usar awkou algo para obter os tempos individuais:

awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times

Responder2

Eu olhei para o man timecomando e notei

Users of the bash shell need to use an explicit path in order to run
the external time command and not the shell builtin variant.  On system
where time is installed in /usr/bin, the first example would become

então acho que você deveria fornecer um caminho para o tempo. Observe que não tenho experiência em zsh

informação relacionada