Esperemos que esta pregunta no sea demasiado genérica. Soy muy nuevo en el scripting de shell y vengo de una experiencia en arquitectura de computadoras/programación sin scripting. He notado en los guiones de mi trabajo que rara vez los guiones se escriben creando un subconjunto alrededor del guión completo. En los scripts que estoy escribiendo, cuando puedo envolverlos con un subshell, lo hago porque evita que se mezcle con otros scripts que llaman al mío (por si acaso). ¿No es esta una práctica común debido a algunos gastos generales asociados con este enfoque? Me está costando encontrar esto en línea.
Ejemplo:
#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell
Respuesta1
Las subcapas tienen gastos generales.
En mi sistema, el costo mínimo de ejecución de bifurcación (cuando ejecuta un programa desde el disco cuando el archivo no está frío) es de 2ms
aproximadamente 1ms
.
Con las subcapas, estás hablando solo del costo de la bifurcación, ya que no es necesario exec
editar ningún archivo. Si los subniveles se mantienen razonablemente bajos, 1ms
es bastante insignificante en programas orientados a humanos. Creo que los humanos no pueden notar nada de lo que sucede más rápido que 50ms
(y ese es el tiempo que les suele tomar a los intérpretes de lenguajes de programación modernos incluso comenzar (estoy hablando python
y Ruby rvm
aquí) con lo más nuevo nodejs
) 100ms
.
Sin embargo, se suma a los bucles, y luego es posible que desee reemplazar, por ejemplo, la táctica o $()
patrón bastante común en el que obtiene return
algo de una función imprimiéndolo en la salida estándar para que el shell principal lo purgue con bashismos como printf -v
(o use un externo rápido). programa para procesar todo el lote).
Elfinalización de bashEl paquete evita específicamente este costo de subcapa regresando a través de nombres de variables pasados usando una técnica descrita enhttp://fvue.nl/wiki/Bash:_Passing_variables_by_reference
Comparando
time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null
con
time for((i=0;i<10000;i++)); do echo hello; done >/dev/null
debería darle una buena estimación de los fork
gastos generales de sus sistemas.
Respuesta2
La ejecución del excelente código proporcionado por PSkocik en mi sistema mostró resultados insignificantes.
Sin embargo, este ejemplo realmente da en el clavo: comandos nativos frente a comandos de subcapa:
MyPath="path/name.ext"
# this takes forever
time for((i=0;i<10000;i++)); do echo "$(basename ${MyPath} )"; done >/dev/null
#this is over 100x less time
time for((i=0;i<10000;i++)); do echo "${MyPath##*/}"; done >/dev/null