Saya bertanya-tanya apakah tee memperlambat jalur pipa. Menulis data ke disk lebih lambat daripada mem-pipkannya.
Apakah tee menunggu dengan mengirimkan data ke pipa berikutnya sampai ditulis ke disk? (Jika tidak, saya kira tee harus mengantri data yang telah dikirim, tetapi tidak ditulis ke disk, yang sepertinya tidak mungkin bagi saya.)
$ program1 input.txt | tee intermediate-file.txt | program2 ...
Jawaban:
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:Sekarang, mari kita tambahkan
tee
di sana, bahkan tidak menulis salinan tambahan — hanya meneruskan saja: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, jadipv
secara substansial lebih cepat daripadatee
.pv
Menggunakansplice(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.
sumber
Tidak ada yang mengejutkan di sini
> POSIX berkata ,
Dan juga itu
Jadi, tanpa menjelaskan "alasan",
tee
mungkin hanya akan membaca dan menulis hingga berapa banyak byte yang dapat masuk ke buffer pipa Anda sekaligus, membilas output pada setiap penulisan.Dan ya, tergantung pada aplikasinya, ini bisa jadi agak tidak efisien - jadi silakan saja menghapus / mengomentari semua ini:
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224
sumber
tee
berjalan lebih cepat?