Logotipo de Zephyrnet

¿Está equivocado su modelo mental de Bash Pipelines?

Fecha:

[Michael Lynch] se encontró con una situación extraña. ¿Por qué compilar y luego ejecutar su programa casi 10 veces? más rápida que simplemente ejecutar el programa por sí solo? [Michael] se topó con este problema mientras evaluaba un proyecto de programación, lo redujo a lo esencial para la repetibilidad y el análisis, y descubrió que resaltaba un modelo mental incorrecto de cómo funcionaban las canalizaciones de bash.

Esta es la situación. Lo primero [Michael]El programa simplificado hace es iniciar un temporizador. Luego simplemente lee y cuenta algunos bytes de stdin, luego imprime cuánto tiempo tardó en suceder. Cuando se ejecuta el programa de prueba de la siguiente manera, se necesitan unos 13 microsegundos.

$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast
bytes: 10
execution time: 13.549µs

Cuando se ejecuta el programa (ya compilado) directamente, el tiempo de ejecución aumenta a 162 microsegundos.

$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes
bytes: 10
execution time: 162.195µs

De nuevo, la única diferencia entre zig build run y ./zig-out/bin/count-bytes es que el primero compila el código y luego lo ejecuta inmediatamente. El segundo simplemente ejecuta el programa compilado.

¿Cómo se puede agregar un paso de compilación adicional? disminuir el tiempo de ejecución? Resulta que el modelo mental de [Michael] sobre cómo funcionan las canalizaciones de bash era incorrecto y hace un gran trabajo al explicando cómo funcionan realmente y por qué eso causó el comportamiento extraño él estaba viendo.

En resumen, los comandos en una canalización bash no se lanzan secuencialmente. Todos se lanzan al mismo tiempo y se ejecutan en paralelo. Eso significaba que cuando se ejecutaba directamente, el programa de contador de bytes de [Michael] se lanzaba inmediatamente. Luego esperó sin hacer mucho durante unos 150 microsegundos mientras el echo '00010203040506070809' | xxd -r -p parte del proceso se dedicó a entregar sus datos para que el programa los leyera. De aquí proviene el tiempo de ejecución adicional al ejecutar la versión ya compilada.

Entonces, ¿por qué compilarlo primero se ejecuta más rápido? La misma razón básica: cuando el zig build run El comando comienza, primero dedica un poco de tiempo a compilar el programa. Luego, cuando el programa compilado se inicia realmente (y comienza su temporizador de ejecución), los datos de entrada de la canalización de bash ya están listos. Por lo tanto, el programa recién compilado se ejecuta en menos tiempo porque no se queda esperando a que los datos de una etapa anterior del proceso estén disponibles.

Es una mirada interesante a cómo funcionan realmente las canalizaciones de bash bajo el capó, y estamos encantados con los detalles [Micheal] pone en todo el viaje y la explicación. Tarde o temprano, detalles como este surgen y hacen que algunas cejas se levanten, como el usuario que descubrió Casos extremos problemáticos relacionados con espacios en comandos ssh.

punto_img

Información más reciente

punto_img