Sim, isso atrasa as coisas. E basicamente tem uma fila de dados não escritos, embora isso seja realmente mantido pelo kernel - todos os programas têm isso, a menos que solicitem explicitamente o contrário.
Por exemplo, aqui está um canal trivial usando pv
, o que é bom porque exibe a taxa de transferência:
$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null
50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%
Agora, vamos adicionar um tee
, nem mesmo escrever uma cópia extra - apenas encaminhá-la:
$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null
50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%
Então, isso é um pouco mais lento, e nem estava fazendo nada! Essa é a sobrecarga de copiar internamente STDIN para STDOUT. (Curiosamente, a adição de um segundo pv
lá permanece em 5,19GiB / s, portanto pv
é substancialmente mais rápida que o tee
. pv
Usa splice(2)
, tee
provavelmente não.)
De qualquer forma, vamos ver o que acontece se eu pedir tee
para gravar em um arquivo no disco. Ele começa com bastante rapidez (~ 800MiB / s), mas, à medida que continua, diminui a velocidade - chegando a ~ 100MiB / s, que é basicamente 100% da largura de banda de gravação em disco. (O início rápido se deve ao armazenamento em cache do kernel na gravação do disco, e a diminuição da velocidade de gravação do disco é o kernel que se recusa a deixar o cache crescer infinitamente.)
Isso importa?
O exposto acima é o pior dos casos. O exemplo acima usa um tubo para transmitir dados o mais rápido possível. O único uso no mundo real em que posso pensar dessa maneira é canalizar dados brutos de YUV de / para ffmpeg
.
Quando você está enviando dados a taxas mais lentas (porque está processando-os etc.), será um efeito muito menos significativo.