- โครงการแอดเวนต์ 25 วันที่มีหัวข้อ การเพิ่มประสิทธิภาพคอมไพเลอร์ C/C++
- ตั้งแต่วันที่ 1 ถึง 25 ธันวาคม แนะนำตัวอย่างการเพิ่มประสิทธิภาพหนึ่งกรณีต่อวันผ่าน บล็อกโพสต์และวิดีโอ
- แต่ละโพสต์กล่าวถึงรายละเอียดอย่างครบถ้วน ได้แก่ เงื่อนไขการนำไปใช้ การถอดรหัสแอสเซมบลี และกรณีที่ไม่ถูกนำไปใช้
- แม้จะเน้นที่ x86-64 แต่ยังมีเนื้อหาเกี่ยวกับสถาปัตยกรรม ARM 64 บิตและ 32 บิต บางส่วน
- เป็นซีรีส์ที่มี คุณค่าทางการศึกษาสูง สำหรับนักพัฒนาที่ต้องการเรียนรู้หลักการทำงานของคอมไพเลอร์
ภาพรวมโครงการ Advent of Compiler Optimisations 2025
- โครงการที่เตรียมมาเป็นเวลาประมาณหนึ่งปี โดยมีการเผยแพร่ กรณีศึกษาการเพิ่มประสิทธิภาพคอมไพเลอร์ ใหม่รายวันตลอดเดือนธันวาคม
- ตั้งแต่วันที่ 1 ถึง 25 ธันวาคม เผยแพร่บล็อกโพสต์และวิดีโอวันละหนึ่งชิ้น
- แต่ละเนื้อหาอธิบายการเพิ่มประสิทธิภาพที่น่าสนใจที่คอมไพเลอร์ทำบนโค้ด C หรือ C++
- การเพิ่มประสิทธิภาพแต่ละอย่างอธิบายอย่างละเอียดถึง เงื่อนไขการใช้งาน การถอดรหัสโค้ดแอสเซมบลี และกรณีที่ไม่ถูกนำไปใช้
- ไม่ได้เป็นการเปรียบเทียบโค้ดอย่างลอย ๆ แต่เป็นการวิเคราะห์การทำงานจริงของคอมไพเลอร์
ขอบเขตเทคโนโลยีที่กล่าวถึง
- ครอบคลุมทั้ง เทคนิคเฉพาะสถาปัตยกรรมระดับล่าง และ เทคนิคการเพิ่มประสิทธิภาพระดับสูง อย่างกว้างขวาง
- โดยหลักจะกล่าวถึง x86-64 เป็นหลัก แต่มีเนื้อหาบางส่วนที่เกี่ยวข้องกับ ARM 64 บิตและ ARM 32 บิต
- จัดเตรียมเป็นแหล่งข้อมูลเชิงปฏิบัติการที่ช่วยให้เรียนรู้การทำงานภายในคอมไพเลอร์และกระบวนการสร้างโค้ดได้
วิธีมีส่วนร่วมและรับชม
- ติดตามโพสต์ทั้งหมดได้ผ่าน แท็ก AoCO2025 บนบล็อก
- รับชมวิดีโอผ่าน ช่อง YouTube หรือ เพลย์ลิสต์เฉพาะทาง
ความสำคัญของโครงการ
- เป็นโครงการส่วนตัวขนาดใหญ่ที่เสร็จสมบูรณ์หลังจากการเตรียมตัวราวหนึ่งปี โดยมีเป้าหมายสำรวจ ความซับซ้อนและประสิทธิภาพของคอมไพเลอร์
- ความพยายามเชิงการศึกษาที่ช่วยให้นักพัฒนามีความเข้าใจ หลักการทำงานจริงของการเพิ่มประสิทธิภาพคอมไพเลอร์ และนำไปปรับใช้เมื่อเขียนโค้ดได้ดียิ่งขึ้น
- ผู้เขียนต้องการแบ่งปัน “ความสุขของการเรียนรู้ว่าคอมไพเลอร์น่าพิศวงมากเพียงใด” ไปพร้อมกัน
แนะนำ Matt Godbolt
- เป็น นักพัฒนา C++ ที่อาศัยอยู่ในชิคาโก และทำงานที่ Hudson River Trading
- ร่วมเป็นพิธีกรพอดแคสต์ Two’s Complement
- กำลังใช้งานที่ Mastodon และ Bluesky
- เนื้อหาบล็อกเผยแพร่ภายใต้สัญญาอนุญาต Creative Commons BY-NC 3.0 Unported
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
หลังจากดูเรื่อง Compiler optimisations ของ Matt แล้ว ลองไปดู บทสัมภาษณ์ ที่ฉันเคยทำกับเขาด้วยก็ดี
สิ่งที่ฉันเชื่อคือ: ทำงานใน ระดับของ abstraction ที่ตัวเองถนัด แต่ก็ต้องเข้าใจเลเยอร์ที่อยู่ถัดลงไปด้วย
ตัวอย่างเช่น ถ้าคุณเป็นโปรแกรมเมอร์ C ก็ควรรู้ว่า C runtime โต้ตอบกับระบบปฏิบัติการอย่างไร ไม่จำเป็นต้องรู้ทุกรายละเอียด แต่ควรพอมีภาพว่าถ้าเกิดปัญหาขึ้นควรเริ่มดูจากตรงไหน
บทความใน ACM Queue ที่ Matt เขียนก็เป็นงานเก่าเหมือนกัน แต่เป็นบทนำที่ดีมากสำหรับทำความเข้าใจแนวคิดการ optimisation แบบนี้
เช่น ตอนทำงานกับ Java การเข้าใจ JVM ทำให้ฉัน optimisation ประสิทธิภาพของ medical software ได้ดีขึ้นมาก และนอกจากนั้นการเข้าใจเลเยอร์ข้างล่างก็สนุกดีด้วย
แม้เขาจะเป็น ผู้เชี่ยวชาญเฉพาะทาง อย่างชัดเจน แต่สิ่งที่น่าประทับใจคือเขาไม่ได้กระโดดเข้าไปหา instruction set ของ x86 ที่ซับซ้อนทันทีตั้งแต่แรก และค่อยๆ อธิบายจากพื้นฐานอย่างเป็นขั้นเป็นตอน
Matt Godbolt เป็น เพชรเม็ดงาม ของชุมชน C และ C++ อย่างแท้จริง
ฉันคิดว่า Compiler Explorer และผลงานของเขาทำให้โลกของนักพัฒนาจำนวนมากดีขึ้น
ฉันกำลังดู Advent of Computer Science Advent Calendars, Day 2 อยู่
ฉันสนใจเทคนิค code amalgamation ที่ SQLite ใช้อยู่มาก
ตามที่ทีม SQLite บอก วิธีนี้เพียงอย่างเดียวก็ช่วยเพิ่มประสิทธิภาพได้ 5–10% แล้ว หวังว่า Matt จะพูดถึงหัวข้อนี้ในเซสชันด้วย
อ้างอิง: วิกิของ Unity build
ถึงอย่างนั้น LTO ก็อาจช้าได้สำหรับ build แบบไม่ incremental ดังนั้นสำหรับการ build แบบครั้งเดียว unity build ก็ยังมีประโยชน์อยู่
ฉันพัฒนาซอฟต์แวร์มา 25 ปีแล้ว แต่ก็ยังสงสัยอยู่ดีว่าฉันใช้ compiler flags ที่เหมาะสมที่สุด หรือเปล่า
ส่วนใหญ่แล้ว
-O2ก็เพียงพอ เมื่อคอมไพเลอร์อัปเดต การ optimisation ภายในก็ดีขึ้นไปด้วย ดังนั้นแทบไม่จำเป็นเลยที่นักพัฒนาต้องไปจูนรายละเอียดเองอีกอย่าง การเพิ่ม flag โดยอิงจาก benchmark ที่ไม่ดีนั้นอันตรายมาก ความต่างด้านประสิทธิภาพ 1–2% เป็นเรื่องปกติตามสภาพของระบบ
ถ้าโครงสร้างของโค้ดเปลี่ยน ความเป็นมิตรกับแคชก็อาจเปลี่ยนและส่งผลต่อประสิทธิภาพได้ กล่าวคือ อาจไม่ใช่เพราะ flag แต่เป็นเพราะการจัดวางโค้ดก็ได้
ฉันตั้งตารอโพสต์ที่เหลืออยู่ เช้าวันนี้ฉันเพิ่งลองสอน SBCL ให้ optimisation แพตเทิร์น
(+ base (* index scale))และ(+ base (ash index n))ให้กลายเป็น คำสั่ง LEA เดียว เท่ากับว่าได้นำสิ่งที่เรียนจาก Day 2 ไปใช้ทันทีคอนเทนต์ของ Godbolt มีเท่าไรก็ไม่เคยพอ
อยากให้มีตอนที่พูดถึงการหารด้วยค่าคงที่จำนวนเต็มด้วย บทนั้นใน Hacker’s Delight ยอดเยี่ยมมาก แต่สำหรับผู้อ่านทั่วไปอาจรู้สึกว่ายากไปนิด
เหมือนเป็น Advent of Code สำหรับสายคลั่งไคล้ compiler
ฉันชอบรูปแบบที่ค่อยๆ สร้างสัญชาตญาณผ่านบทเรียน optimisation คำเล็กคำละน้อยในแต่ละวันมาก
ถ้าเข้าใจว่า compiler ทำ อะไร และทำไม คุณก็จะเป็นโปรแกรมเมอร์ที่ดีขึ้นได้ไม่ว่าจะใช้ภาษาไหน