Me pregunto si el tee ralentiza las tuberías. Escribir datos en el disco es más lento que canalizarlos, después de todo.
¿Espera tee con el envío de datos a la siguiente tubería hasta que se haya escrito en el disco? (Si no, supongo que tee tiene que poner en cola los datos que se han enviado, pero que no se han escrito en el disco, lo que me parece poco probable).
$ program1 input.txt | tee intermediate-file.txt | program2 ...
Respuestas:
Sí, ralentiza las cosas. Básicamente, tiene una cola de datos no escritos, aunque en realidad el núcleo lo mantiene: todos los programas tienen eso, a menos que explícitamente soliciten lo contrario.
Por ejemplo, aquí hay una tubería trivial que usa
pv
, lo cual es bueno porque muestra la velocidad de transferencia:Ahora, agreguemos una
tee
allí, sin siquiera escribir una copia adicional, solo reenviando:Entonces, eso es un poco más lento, ¡y ni siquiera estaba haciendo nada! Esa es la sobrecarga de copiar internamente STDIN a STDOUT. (Curiosamente, agregar un segundo
pv
allí permanece en 5.19GiB / s, por lo quepv
es sustancialmente más rápido quetee
.pv
Usossplice(2)
,tee
probablemente no).De todos modos, veamos qué sucede si le digo
tee
que escriba en un archivo en el disco. Comienza bastante rápido (~ 800MiB / s) pero a medida que avanza, se ralentiza, en última instancia, hasta ~ 100MiB / s, que es básicamente el 100% del ancho de banda de escritura del disco. (El inicio rápido se debe a que el núcleo almacena en caché la escritura del disco, y la ralentización de la velocidad de escritura del disco es que el núcleo se niega a permitir que el caché crezca infinitamente).¿Importa?
Lo anterior es el peor de los casos. Lo anterior usa una tubería para arrojar datos lo más rápido posible. El único uso en el mundo real que se me ocurre es canalizar datos YUV sin procesar hacia / desde
ffmpeg
.Cuando envía datos a velocidades más lentas (porque los está procesando, etc.) será un efecto mucho menos significativo.
fuente
Nada sorprendente aquí, después de todo
> POSIX dice :
Y tambien que
Entonces, sin explicar "justificación",
tee
probablemente solo leerá y escribirá hasta cuantos bytes puedan caber en su buffer de tubería a la vez, vaciando la salida en cada escritura.Y sí, dependiendo de la aplicación, esto puede ser bastante ineficiente, así que siéntase libre de simplemente eliminar / comentar cualquiera de estos:
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224
fuente
tee
ejecute más rápido?