Los bucles de shell son lentos y bash son los más lentos. Los proyectiles no están destinados a realizar trabajos pesados en bucles. Los shells están destinados a lanzar algunos procesos externos optimizados en lotes de datos.
De todos modos, tenía curiosidad por cómo se comparan los bucles de shell, así que hice un pequeño punto de referencia:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Detalles:
- CPU: Intel (R) Core (TM) i5 CPU M 430 @ 2.27GHz
- ksh: versión sh (AT&T Research) 93u + 2012-08-01
- bash: GNU bash, versión 4.3.11 (1) -release (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- guión: 0.5.7-4ubuntu1
)
Los resultados (abreviados) (tiempo por iteración) son:
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
De los resultados:
Si desea un bucle de shell un poco más rápido, entonces si tiene la [[
sintaxis y desea un bucle de shell rápido, está en un shell avanzado y también tiene el bucle de tipo C. Usa el me gusta C para el ciclo, entonces. Pueden ser aproximadamente 2 veces más rápidos que los while [
bucles en el mismo shell.
- ksh tiene el
for (
ciclo más rápido a aproximadamente 2.7 µs por iteración
- el guión tiene el
while [
bucle más rápido a aproximadamente 5.8 µs por iteración
C para los bucles puede ser de 3 a 4 órdenes decimales de magnitud más rápido. (Escuché que los Torvalds aman a C).
El C for loop optimizado es 56500 veces más rápido que el while [
bucle de bash (el bucle de shell más lento) y 6750 veces más rápido que el for (
bucle de ksh (el bucle de shell más rápido).
Una vez más, la lentitud de los shells no debería importar mucho, porque el patrón típico con los shells es descargarse a unos pocos procesos de programas externos optimizados.
Con este patrón, los shells a menudo hacen que sea mucho más fácil escribir scripts con un rendimiento superior a los scripts de Python (la última vez que lo verifiqué, la creación de canales de proceso en Python fue bastante torpe).
Otra cosa a considerar es el tiempo de inicio.
time python3 -c ' '
tarda de 30 a 40 ms en mi PC, mientras que los shells tardan alrededor de 3 ms. Si ejecuta una gran cantidad de scripts, esto se suma rápidamente y puede hacer mucho en los 27-37 ms adicionales que Python tarda solo para comenzar. Las secuencias de comandos pequeñas se pueden terminar varias veces en ese período de tiempo.
(NodeJs es probablemente el peor tiempo de ejecución de secuencias de comandos en este departamento, ya que se necesitan unos 100 ms para comenzar (aunque una vez que haya comenzado, sería difícil encontrar un mejor rendimiento entre los lenguajes de secuencias de comandos)).