The Physics of Build Systems: เมื่อการเพิ่มซีพียูไม่ช่วยให้คอมพิวเตอร์เร็วกว่าเดิม
เจาะลึกกลศาสตร์เบื้องหลังระบบ Build Systems ทำไมเพิ่มคอร์ซีพียูถึงไม่ช่วยให้โปรเจกต์ใหญ่เร็วขึ้น และอะไรคือข้อจำกัดที่แท้จริงของซอฟต์แวร์

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การเพิ่มคอร์ซีพียูช่วยลดเวลาได้เฉพาะงานที่ทำงานพร้อมกันได้
- กราฟงาน (Task Graph) เป็นตัวกำหนดขีดจำกัดความเร็วสูงสุดของบิลด์
- การคอมไพล์แบบเพิ่มส่วน (Incremental Build) ช่วยตัดงานที่ไม่จำเป็นออก
เมื่อโปรเจกต์ซอฟต์แวร์มีขนาดใหญ่ขึ้น การเปลี่ยนแปลงโค้ดเพียงเล็กน้อยอาจส่งผลกระทบต่อทั้งระบบ การแก้ปัญหาด้วยการซื้อเครื่องคอมพิวเตอร์ที่มีซีพียูทรงพลังมากขึ้นหรือมีคอร์ประมวลผลจำนวนมาก อาจไม่ได้ช่วยให้การคอมไพล์โค้ดเร็วขึ้นอย่างที่หลายคนคาดคิด
ทีมงาน Tuist ได้เผยแพร่บทความเกี่ยวกับการทำงานเบื้องหลังของระบบ Build Systems โดยเปรียบเทียบว่า การทำงานของเครื่องมือเหล่านี้มีกฎเกณฑ์ทางฟิสิกส์เป็นตัวกำหนดข้อจำกัด ซึ่งเริ่มต้นจากกราฟของงาน (Task Graph) ที่อธิบายความสัมพันธ์ระหว่างภาระงานต่าง ๆ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
สมมติว่าโปรเจกต์ประกอบด้วยงานสามชิ้น ได้แก่ การคอมไพล์ไฟล์ต้นฉบับสองไฟล์ที่ไม่มีความเกี่ยวข้องกัน และงานลิงก์ผลลัพธ์ที่ต้องรอข้อมูลจากงานสองชิ้นแรก แม้เครื่องคอมพิวเตอร์จะมีคอร์ประมวลผลสูงถึง 32 คอร์ แต่ระยะเวลาในการคอมไพล์ก็ยังคงใช้เวลาเท่ากับเครื่องที่มี 2 คอร์ หากโครงสร้างของกราฟงานยังคงบังคับให้ต้องรอผลลัพธ์ตามลำดับขั้น
ข้อจำกัดของระบบบิลด์จึงแบ่งออกเป็นสองส่วนหลัก ได้แก่ ปริมาณงานทั้งหมดที่หารด้วยจำนวนคอร์ซีพียู และสายโซ่ของงานที่ต้องทำตามลำดับก่อนหลัง ซึ่งพลังประมวลผลที่เพิ่มขึ้นไม่สามารถย่นระยะเวลาของสายโซ่นี้ให้สั้นลงได้
"A change that should be local wakes up half the repository. A machine with more processor cores does not make the build noticeably faster."
Tuist
แนวคิดเรื่อง Task Graph และ Critical Path ในบทความนี้สะท้อนถึงกฎของ Amdahl ในวิทยาการคอมพิวเตอร์ ซึ่งระบุว่าประสิทธิภาพสูงสุดของระบบถูกจำกัดด้วยส่วนที่ไม่สามารถทำงานแบบขนานได้ การทำความเข้าใจโครงสร้างการพึ่งพากันของโค้ดจึงมีความสำคัญมากกว่าการอัปเกรดฮาร์ดแวร์เพียงอย่างเดียว
สำหรับการทำงานจริง นักพัฒนาส่วนใหญ่ไม่ได้เริ่มต้นใหม่ทั้งหมดทุกครั้ง แต่จะใช้กระบวนการคอมไพล์แบบเพิ่มส่วน (Incremental Build) เพื่อตรวจสอบเฉพาะไฟล์ที่มีการเปลี่ยนแปลงและอัปเดตเฉพาะส่วนที่เกี่ยวข้อง ซึ่งช่วยลดทอนขั้นตอนที่ไม่จำเป็นออกไปได้เป็นอย่างมาก
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น