โลโก้เซเฟอร์เน็ต

แบบจำลองทางจิตของ Bash Pipelines ของคุณผิดหรือเปล่า?

วันที่:

[Michael Lynch] พบกับสถานการณ์ที่แปลกประหลาด เหตุใดการคอมไพล์จึงรันโปรแกรมของเขาเกือบ 10 เท่า เร็วขึ้น มากกว่าแค่รันโปรแกรมเอง? [Michael] ประสบปัญหานี้ในขณะที่เปรียบเทียบโครงการการเขียนโปรแกรม โดยแยกมันออกตามความจำเป็นสำหรับการทำซ้ำและการวิเคราะห์ และพบว่ามันเน้นย้ำถึงแบบจำลองทางจิตที่ไม่ถูกต้องเกี่ยวกับวิธีการทำงานของ bash ไปป์ไลน์

นี่คือสถานการณ์ สิ่งแรกที่โปรแกรมลดขนาดลงของ [Michael] ทำคือการเริ่มจับเวลา จากนั้นมันก็อ่านและนับจำนวนไบต์จาก stdinจากนั้นพิมพ์ออกมาว่าต้องใช้เวลานานเท่าใดจึงจะเกิดขึ้น เมื่อรันโปรแกรมทดสอบในลักษณะต่อไปนี้จะใช้เวลาประมาณ 13 ไมโครวินาที

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

เมื่อรันโปรแกรม (ที่คอมไพล์แล้ว) โดยตรง เวลาดำเนินการจะเพิ่มขึ้นเป็น 162 ไมโครวินาที

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

อีกครั้งความแตกต่างเพียงอย่างเดียวระหว่าง zig build run และ ./zig-out/bin/count-bytes คือคอมไพล์โค้ดครั้งแรกจากนั้นจึงรันทันที ส่วนที่สองก็แค่รันโปรแกรมที่คอมไพล์แล้ว

จะเพิ่มขั้นตอนการคอมไพล์พิเศษได้อย่างไร ลดลง เวลาดำเนินการ? ปรากฎว่าแบบจำลองทางจิตของ [Michael] เกี่ยวกับวิธีการทำงานของ bash ไปป์ไลน์นั้นไม่ถูกต้อง และเขาทำงานได้ดีมาก อธิบายวิธีการทำงานจริง และเหตุใดจึงทำให้เกิดพฤติกรรมแปลกๆ เขากำลังเห็น

กล่าวโดยสรุป คำสั่งใน bash ไปป์ไลน์จะไม่ถูกเรียกใช้ตามลำดับ ทั้งหมดเปิดตัวพร้อมกันและดำเนินการแบบคู่ขนาน นั่นหมายความว่าเมื่อรันโดยตรง โปรแกรมตัวนับไบต์ของ [Michael] จะเปิดตัวทันที จากนั้นมันก็รอไปรอบๆ โดยไม่ได้ทำอะไรมากเป็นเวลาประมาณ 150 ไมโครวินาทีในขณะที่ echo '00010203040506070809' | xxd -r -p ส่วนหนึ่งของไปป์ไลน์มีการส่งข้อมูลเพื่อให้โปรแกรมอ่าน นี่คือที่มาของเวลาดำเนินการเพิ่มเติมเมื่อเรียกใช้เวอร์ชันที่คอมไพล์แล้ว

เหตุใดการคอมไพล์มันจึงทำงานเร็วขึ้น? เหตุผลพื้นฐานเดียวกัน: เมื่อ zig build run คำสั่งเริ่มทำงาน โดยจะใช้เวลาเล็กน้อยในการคอมไพล์โปรแกรมก่อน จากนั้นเมื่อโปรแกรมที่คอมไพล์ถูกเปิดใช้งานจริง (และเริ่มจับเวลาการดำเนินการ) ข้อมูลอินพุตจากไปป์ไลน์ bash ก็พร้อมแล้ว ดังนั้น โปรแกรมที่คอมไพล์ใหม่จะดำเนินการโดยใช้เวลาน้อยลง เนื่องจากไม่ได้นั่งรอข้อมูลจากช่วงก่อนหน้าเพื่อให้พร้อมใช้งาน

เป็นการดูที่น่าสนใจว่า bash ไปป์ไลน์ทำงานอย่างไรภายใต้ประทุนจริง ๆ และเรายินดีกับรายละเอียดที่ [Micheal] นำมาใช้ในการเดินทางและคำอธิบายทั้งหมด ไม่ช้าก็เร็ว รายละเอียดเช่นนี้จะครอบตัดและทำให้คิ้วบางยกขึ้น เช่นเดียวกับผู้ใช้ที่ค้นพบ กรณีขอบที่ยุ่งยากเกี่ยวกับช่องว่างในคำสั่ง ssh.

จุด_img

ข่าวกรองล่าสุด

จุด_img