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:
$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null
50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%
Ahora, agreguemos una tee
allí, sin siquiera escribir una copia adicional, solo reenviando:
$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null
50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%
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 que pv
es sustancialmente más rápido que tee
. pv
Usos splice(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.