
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 .zshrc
parecida 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 time
para 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 time
apó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 awk
ou algo para obter os tempos individuais:
awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times
Responder2
Eu olhei para o man time
comando 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