Me preguntaba cuál es la forma más rápida de ejecutar un script, he estado leyendo que hay una diferencia de velocidad entre mostrar el resultado del script en el terminal, redirigirlo a un archivo o tal vez /dev/null
.
Entonces, si el resultado no es importante, ¿cuál es la forma más rápida de hacer que el script funcione más rápido, incluso si es mínimo?
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Respuestas:
Los terminales en estos días son más lentos de lo que solían ser, principalmente porque las tarjetas gráficas ya no se preocupan por la aceleración 2D. De hecho, imprimir en un terminal puede ralentizar un script, particularmente cuando se trata de desplazarse.
En consecuencia,
./script.sh
es más lento que./script.sh >script.log
, lo que a su vez es más lento que/script.sh >/dev/null
, porque estos últimos implican menos trabajo. Sin embargo, si esto hace una diferencia suficiente para cualquier propósito práctico depende de la cantidad de salida que produce su script y qué tan rápido. Si su script escribe 3 líneas y sale, o si imprime 3 páginas cada pocas horas, probablemente no necesite molestarse con las redirecciones.Editar: Algunos puntos de referencia rápidos (y completamente rotos):
En una consola Linux, 240x75:
En un
xterm
, 260x78:Redireccionar a un archivo, en un disco Samsung SSD 850 PRO 512GB:
Redirigir a
/dev/null
:fuente
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
imprime más de 100000 líneas en un solo segundo en mi MBP)xterm
s en HP Apollo de hace 30 años solía gatear en comparación conxterms
HP-UX de hace 20 años. Sin embargo, una consola Linux con una tarjeta de video Matrox de hace 15 años era más lenta que la misma consola Linux con una tarjeta S3 de hace 20 años. Y una consola Linux con buffer de cuadros de alta resolución en una tarjeta moderna es simplemente inutilizable. :)Hubiera aceptado instintivamente la respuesta de Satō Katsura; que tiene sentido. Sin embargo, es bastante fácil de probar.
Probé escribir un millón de líneas en la pantalla, escribir (agregar) a un archivo y redirigir a
/dev/null
. Probé cada uno de estos por turno, luego hice cinco réplicas. Estos son los comandos que usé.Luego tracé el total de veces a continuación.
Como puede ver, las presunciones de Satō Katsura eran correctas. Según la respuesta de Satō Katsura, también dudo que el factor limitante sea la salida, por lo que es poco probable que la elección de la salida tenga un efecto sustancial en la velocidad general del guión.
FWIW, mi respuesta original tenía un código diferente, que tenía el archivo anexado y
/dev/null
redirigido dentro del bucle.Como John Kugelman señala en los comentarios, esto agrega muchos gastos generales. Dado que la cuestión está, esto no es realmente el camino correcto para probarlo, pero lo dejaré aquí, ya que muestra claramente el costo de volver a abrir un archivo repetidamente desde dentro de la propia secuencia de comandos.
En este caso, los resultados se invierten.
fuente
xterm
, que a su vez es ~ 3 veces más lenta que/dev/null
.Otra forma de acelerar un script es usar un intérprete de shell más rápido. Compare las velocidades de un bucle ocupado POSIX , ejecute en
bash
v4.4 ,ksh
v93u + 20120801 ydash
v0.5.8 .bash
:Salida:
ksh
:Salida:
dash
:Salida:
Un subconjunto de comandos en
bash
yksh
son retrocompatibles con todos los comandos endash
. Unbash
script que solo usa comandos en ese subconjunto debería funcionardash
.Algunas
bash
secuencias de comandos que utilizan nuevas funciones se pueden convertir a otro intérprete. Si labash
secuencia de comandos depende en gran medida de las características más nuevas, puede que no valga la pena molestarse: algunasbash
características nuevas son mejoras que son más fáciles de codificar y más eficientes (a pesar debash
ser generalmente más lentas), de modo que eldash
equivalente (que podría implicar la ejecución) varios otros comandos), sería más lento.En caso de duda, realice una prueba ...
fuente