¿Cuál es la sobrecarga de usar subcapas?

¿Cuál es la sobrecarga de usar subcapas?

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 2msaproximadamente 1ms.

Con las subcapas, estás hablando solo del costo de la bifurcación, ya que no es necesario execeditar ningún archivo. Si los subniveles se mantienen razonablemente bajos, 1mses 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 pythony Ruby rvmaquí) 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 returnalgo 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 forkgastos 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     

información relacionada