1 คะแนน โดย GN⁺ 2025-12-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โครงการแอดเวนต์ 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 บิต
  • จัดเตรียมเป็นแหล่งข้อมูลเชิงปฏิบัติการที่ช่วยให้เรียนรู้การทำงานภายในคอมไพเลอร์และกระบวนการสร้างโค้ดได้

วิธีมีส่วนร่วมและรับชม

ความสำคัญของโครงการ

  • เป็นโครงการส่วนตัวขนาดใหญ่ที่เสร็จสมบูรณ์หลังจากการเตรียมตัวราวหนึ่งปี โดยมีเป้าหมายสำรวจ ความซับซ้อนและประสิทธิภาพของคอมไพเลอร์
  • ความพยายามเชิงการศึกษาที่ช่วยให้นักพัฒนามีความเข้าใจ หลักการทำงานจริงของการเพิ่มประสิทธิภาพคอมไพเลอร์ และนำไปปรับใช้เมื่อเขียนโค้ดได้ดียิ่งขึ้น
  • ผู้เขียนต้องการแบ่งปัน “ความสุขของการเรียนรู้ว่าคอมไพเลอร์น่าพิศวงมากเพียงใด” ไปพร้อมกัน

แนะนำ Matt Godbolt

  • เป็น นักพัฒนา C++ ที่อาศัยอยู่ในชิคาโก และทำงานที่ Hudson River Trading
  • ร่วมเป็นพิธีกรพอดแคสต์ Two’s Complement
  • กำลังใช้งานที่ Mastodon และ Bluesky
  • เนื้อหาบล็อกเผยแพร่ภายใต้สัญญาอนุญาต Creative Commons BY-NC 3.0 Unported

1 ความคิดเห็น

 
GN⁺ 2025-12-03
ความคิดเห็นจาก Hacker News
  • หลังจากดูเรื่อง Compiler optimisations ของ Matt แล้ว ลองไปดู บทสัมภาษณ์ ที่ฉันเคยทำกับเขาด้วยก็ดี
    สิ่งที่ฉันเชื่อคือ: ทำงานใน ระดับของ abstraction ที่ตัวเองถนัด แต่ก็ต้องเข้าใจเลเยอร์ที่อยู่ถัดลงไปด้วย
    ตัวอย่างเช่น ถ้าคุณเป็นโปรแกรมเมอร์ C ก็ควรรู้ว่า C runtime โต้ตอบกับระบบปฏิบัติการอย่างไร ไม่จำเป็นต้องรู้ทุกรายละเอียด แต่ควรพอมีภาพว่าถ้าเกิดปัญหาขึ้นควรเริ่มดูจากตรงไหน
    บทความใน ACM Queue ที่ Matt เขียนก็เป็นงานเก่าเหมือนกัน แต่เป็นบทนำที่ดีมากสำหรับทำความเข้าใจแนวคิดการ optimisation แบบนี้

    • ฉันเคยได้ยินอาจารย์สมัยมหาวิทยาลัยพูดว่า “จงเข้าใจเลเยอร์ที่อยู่ถัดลงไปจากที่ตัวเองทำงานอยู่” ซึ่งช่วยอาชีพของฉันได้มาก
      เช่น ตอนทำงานกับ Java การเข้าใจ JVM ทำให้ฉัน optimisation ประสิทธิภาพของ medical software ได้ดีขึ้นมาก และนอกจากนั้นการเข้าใจเลเยอร์ข้างล่างก็สนุกดีด้วย
    • ขอบคุณ Adam 😊
  • แม้เขาจะเป็น ผู้เชี่ยวชาญเฉพาะทาง อย่างชัดเจน แต่สิ่งที่น่าประทับใจคือเขาไม่ได้กระโดดเข้าไปหา instruction set ของ x86 ที่ซับซ้อนทันทีตั้งแต่แรก และค่อยๆ อธิบายจากพื้นฐานอย่างเป็นขั้นเป็นตอน

  • Matt Godbolt เป็น เพชรเม็ดงาม ของชุมชน C และ C++ อย่างแท้จริง
    ฉันคิดว่า Compiler Explorer และผลงานของเขาทำให้โลกของนักพัฒนาจำนวนมากดีขึ้น

    • อะไรนะ?! Godbolt เป็นคนจริงๆ เหรอ!?
  • ฉันกำลังดู Advent of Computer Science Advent Calendars, Day 2 อยู่

    • ดูเหมือนว่าตอนนี้เรามาถึงจุดนั้นแล้วจริงๆ
  • ฉันสนใจเทคนิค code amalgamation ที่ SQLite ใช้อยู่มาก
    ตามที่ทีม SQLite บอก วิธีนี้เพียงอย่างเดียวก็ช่วยเพิ่มประสิทธิภาพได้ 5–10% แล้ว หวังว่า Matt จะพูดถึงหัวข้อนี้ในเซสชันด้วย

    • นี่เป็นหัวข้อที่ค่อนข้างทั่วไป และจริงๆ แล้วแทบจะเรียกว่าเป็นรูปแบบการ build ที่เรียกว่า “unity build” มากกว่าจะเป็น compiler optimisation
      อ้างอิง: วิกิของ Unity build
    • ทุกวันนี้คนใช้ LTO (Link Time Optimization) กันมากกว่า unity build
      ถึงอย่างนั้น LTO ก็อาจช้าได้สำหรับ build แบบไม่ incremental ดังนั้นสำหรับการ build แบบครั้งเดียว unity build ก็ยังมีประโยชน์อยู่
  • ฉันพัฒนาซอฟต์แวร์มา 25 ปีแล้ว แต่ก็ยังสงสัยอยู่ดีว่าฉันใช้ compiler flags ที่เหมาะสมที่สุด หรือเปล่า

    • จากประสบการณ์ของฉัน ยิ่งมี flag น้อยยิ่งดี
      ส่วนใหญ่แล้ว -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 ทำ อะไร และทำไม คุณก็จะเป็นโปรแกรมเมอร์ที่ดีขึ้นได้ไม่ว่าจะใช้ภาษาไหน