Logo Zephyrnet

Apakah Model Mental Bash Pipelines Anda Salah?

Tanggal:

[Michael Lynch] mengalami situasi yang aneh. Kenapa dikompilasi lalu menjalankan programnya hampir 10x lebih cepat daripada hanya menjalankan program itu sendiri? [Michael] mengalami masalah ini saat membuat tolok ukur proyek pemrograman, mengupasnya hingga ke hal-hal penting untuk pengulangan dan analisis, dan menemukan bahwa masalah ini menyoroti model mental yang salah tentang cara kerja saluran pipa bash.

Inilah situasinya. Hal pertama yang dilakukan program sederhana [Michael] adalah memulai pengatur waktu. Kemudian ia hanya membaca dan menghitung beberapa byte darinya stdin, lalu mencetak berapa lama waktu yang dibutuhkan hingga hal tersebut terjadi. Saat menjalankan program pengujian dengan cara berikut, dibutuhkan waktu sekitar 13 mikrodetik.

$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast
bytes: 10
execution time: 13.549µs

Saat menjalankan program (yang sudah dikompilasi) secara langsung, waktu eksekusi bertambah menjadi 162 mikrodetik.

$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes
bytes: 10
execution time: 162.195µs

Sekali lagi, satu-satunya perbedaan antara zig build run dan ./zig-out/bin/count-bytes adalah yang pertama mengkompilasi kodenya, lalu segera menjalankannya. Yang kedua hanya menjalankan program yang dikompilasi.

Bagaimana cara menambahkan langkah kompilasi tambahan mengurangi waktu pelaksanaannya? Ternyata model mental [Michael] tentang cara kerja bash pipeline tidak benar, dan dia melakukan pekerjaannya dengan baik menjelaskan cara kerjanya sebenarnya, dan mengapa hal itu menyebabkan perilaku aneh tersebut dia melihat.

Singkatnya, perintah dalam pipa bash tidak diluncurkan secara berurutan. Semuanya diluncurkan pada waktu yang sama dan dijalankan secara paralel. Artinya ketika dijalankan secara langsung, program penghitung byte [Michael] segera diluncurkan. Kemudian ia menunggu tanpa melakukan apa pun selama sekitar 150 mikrodetik sementara echo '00010203040506070809' | xxd -r -p bagian dari pipeline berhasil mengirimkan datanya agar dapat dibaca oleh program. Dari sinilah waktu eksekusi tambahan berasal ketika menjalankan versi yang sudah dikompilasi.

Jadi mengapa kompilasi pertama kali berjalan lebih cepat? Alasan dasar yang sama: ketika zig build run perintah dimulai, ia menghabiskan sedikit waktu untuk mengkompilasi program terlebih dahulu. Kemudian ketika program yang dikompilasi benar-benar diluncurkan (dan memulai pengatur waktu eksekusinya), data masukan dari pipa bash sudah siap. Jadi, program yang baru dikompilasi akan dieksekusi dalam waktu lebih singkat karena tidak perlu menunggu data dari pipeline sebelumnya tersedia.

Ini adalah gambaran yang menarik tentang bagaimana sebenarnya saluran pipa bash berfungsi, dan kami senang dengan detail yang [Micheal] masukkan ke dalam keseluruhan perjalanan dan penjelasannya. Cepat atau lambat, detail seperti ini akan muncul dan membuat beberapa orang terkejut, seperti pengguna yang menemukannya kasus tepi yang merepotkan mengenai spasi dalam perintah ssh.

tempat_img

Intelijen Terbaru

tempat_img