
Estoy intentando mejorar la ejecución de mis archivos de puntos zsh y necesito cronometrar la ejecución de mis subscripts. Tengo una sección de código que .zshrc
se ve así:
typeset -U config_files
config_files=($DOTFILES/**/*.zsh)
for file in ${(M)config_files}
do
source file
done
Lo que me gustaría hacer es algo como esto:
for file in ${(M)config_files}
do
\time -f %E source file
done
Pero desafortunadamente recibo este tipo de respuesta:
time: cannot run source: No such file or directory
¿Dónde me equivoco?
Respuesta1
source
es un comando incorporado, no externo, por lo que usar el externo time
para cronometrar no tiene sentido. Haz cualquiera de:
TIMEFMT=%E
for file in ${(M)config_files}
do
time (source file)
done
O:
for file in ${(M)config_files}
do
\time -f %E zsh -c 'source "$1"' zsh "$file"
done
En la antigua,la subcapa es necesaria porque:
Nota adicional: el tiempo incorporado aplicado a cualquier construcción que se ejecute en el shell actual se ignora silenciosamente. Entonces, aunque sintácticamente está bien poner una apertura rizada o un bucle repetido o similar inmediatamente después de la palabra clave time, no obtendrás estadísticas de tiempo. En su lugar, debe usar pares para forzar una subcapa, que luego se cronometra.
Y en el último caso, estás iniciando una nueva instancia de zsh para cada archivo. Entonces, en ambos casos, no hay manera de cronometrar fácilmente los scripts dependientes (es decir, cuando un archivo de configuración hace algo que es requerido por otro archivo de configuración o que de alguna manera afecta a otro). Alternativamente, puede guardar la salida time
después de cada fuente, lo que le brindará tiempo acumulativo:
TIMEFMT=%E
{time} 2> times
for file in ${(M)config_files}
do
source file
{time} 2>> times
done
Luego puedes usar awk
o algo para obtener los tiempos individuales:
awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times
Respuesta2
Miré el man time
comando y noté
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
así que supongo que deberías proporcionar un camino para el tiempo. Tenga en cuenta que no tengo experiencia en zsh