![Cómo `cronometrar` un comando N veces (y poder usar CTRL-C para detenerlo)](https://rvso.com/image/168808/C%C3%B3mo%20%60cronometrar%60%20un%20comando%20N%20veces%20(y%20poder%20usar%20CTRL-C%20para%20detenerlo).png)
Pregunta corta:
Esto se hace en una Mac:
time for i in {1..10}; do python3 foo.py ; done
pero CTRL-C no podrá detenerlo. ¿Cómo hacer que funcione? (¿o cómo cronometrar el tiempo de ejecución de N veces?)
Detalles:
Hay una prueba estándar del programa de github y podría ejecutarla:
python3 foo.py
o
time python3 foo.py
e informa un tiempo de ejecución de 0,27 segundos. Dado que la prueba está conectada para 1000 casos de prueba y a un marco de prueba, no quiero cambiar la prueba, por lo que quiero cronometrarla 100 veces. Parece que el comando time
no tiene forma de cronometrar 10 o 100 veces (esto es algo extraño en Unix que durante tantos años y algo tan útil y simple no esté integrado time
). Se puede utilizar lo siguiente:
time for i in {1..10}; do python3 foo.py ; done
pero CTRL-C no podrá detenerlo: detendrá ese script de Python y seguirá ejecutando el resto. Afortunadamente no fue así 100
o 1000
fue escrito. ¿Hay alguna manera de usarlo time
o una mejor manera de hacerlo? (¿además de cambiar el programa?)
Respuesta1
No es posible Ctrl-C
porque estás generando nuevos procesos en un bucle. Tendría que interrumpirlos todos presionando Ctrl-C
100, 1000 veces más rápido a medida que se ejecuta cada iteración.
Como alternativa, puede lograr el mismo efecto bash
presionando Ctrl-Z
, lo que detendría el último proceso de primer plano creado por el bucle yabandonarel bucle mismo.
Respuesta2
Suponiendo que el shell es zsh
, simplemente haz:
time (repeat 10 python3 foo.py)
Eso multiplica el proceso (y esperó a los niños) que ejecuta el subshell que ejecuta el comando python3 10 veces.
Con bash
o ksh93
(o zsh
), puedes hacer:
time (for ((i=0;i<10;i++)) { python3 foo.py; })
POSIXly, podrías hacer:
time -p sh -c '
i=0; while [ "$i" -lt 10 ]; do
python3 foo.py
i=$((i + 1))
done'
Respuesta3
No es una solución "Ctrl+C", sino algo si desea detener una secuencia de bucle larga "elegantemente". Todo lo que necesitas hacer es crear ./stop-foo-py
un archivo; con $ echo "" > ./stop-foo-py
por ejemplo (en otra terminal).
rm ./stop-foo-py
time for ((i=0;i<1000;i++));
do if [ ! -f "./stop-foo-py" ]; then
python foo.py ;
fi ;
done
o rm ./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; done
en una línea.
Agrega aproximadamente la mitad deEMpor bucle único.
$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done
real 0m0.548s
user 0m0.157s
sys 0m0.359s