Ya, itu memperlambat segalanya. Dan pada dasarnya memang ada antrian data tidak tertulis, meskipun itu sebenarnya dikelola oleh kernel — semua program memilikinya, kecuali mereka secara eksplisit meminta sebaliknya.
Misalnya, ini adalah penggunaan pipa sepele pv
, yang bagus karena menampilkan kecepatan transfer:
$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null
50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%
Sekarang, mari kita tambahkan tee
di sana, bahkan tidak menulis salinan tambahan — hanya meneruskan saja:
$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null
50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%
Jadi, itu sedikit lebih lambat, dan bahkan tidak melakukan apa-apa! Itulah overhead tee menyalin STDIN ke STDOUT secara internal. (Menariknya, menambahkan satu detik pv
di sana tetap di 5.19GiB / s, jadi pv
secara substansial lebih cepat daripada tee
. pv
Menggunakan splice(2)
, tee
kemungkinan tidak.)
Pokoknya, mari kita lihat apa yang terjadi jika saya meminta tee
untuk menulis ke file di disk. Dimulai dengan cukup cepat (~ 800MiB / s) tetapi seiring berjalannya waktu, ia terus melambat — akhirnya turun ke ~ 100MiB / s, yang pada dasarnya 100% dari bandwidth disk write. (Awal yang cepat adalah karena kernel melakukan caching pada penulisan disk, dan perlambatan pada kecepatan penulisan disk adalah kernel yang menolak untuk membiarkan cache tumbuh tanpa batas.)
Apakah itu penting?
Di atas adalah kasus terburuk. Di atas menggunakan pipa untuk memuntahkan data secepat mungkin. Satu-satunya penggunaan di dunia nyata yang bisa saya pikirkan adalah memipipkan data YUV mentah ke / dari ffmpeg
.
Saat Anda mengirim data dengan kecepatan lebih lambat (karena Anda memprosesnya, dll.) Itu akan menjadi efek yang jauh lebih kecil.