Linker Elf2 ใหม่ของ Zig ให้ประสิทธิภาพ Incremental Build เร็วขึ้น 11 เท่าด้วย Overhead เกือบศูนย์

ทีมชุมชน BigGo
Linker Elf2 ใหม่ของ Zig ให้ประสิทธิภาพ Incremental Build เร็วขึ้น 11 เท่าด้วย Overhead เกือบศูนย์

ภาษาโปรแกรมมิ่ง Zig ได้เปิดตัว linker ใหม่ที่ล้ำสมัยชื่อ Elf2 ที่ช่วยปรับปรุงความเร็วในขั้นตอนการพัฒนาอย่างมาก linker ที่สร้างขึ้นเองนี้เป็นก้าวสำคัญต่อเป้าหมายของ Zig ในการสร้าง compilation toolchain แบบบูรณาการที่สามารถเอาชนะเครื่องมือพัฒนาแบบดั้งเดิมได้

วิธีการเปิดใช้งาน Linker Elf2

  • Command line: ใช้ flag -fnew-linker
  • Build script: ตั้งค่า exe.use_new_linker = true
  • อัตโนมัติ: เปิดใช้งานโดยอัตโนมัติด้วย -fincremental บนเป้าหมาย ELF
  • การรองรับปัจจุบัน: รองรับเฉพาะรูปแบบ ELF เท่านั้น (วางแผนเพิ่มแพลตฟอร์มอื่นๆ)

การปรับปรุงประสิทธิภาพที่เปลี่ยนแปลงขั้นตอนการพัฒนา

Linker Elf2 ใหม่ให้การปรับปรุงความเร็วที่น่าทึ่งสำหรับ incremental build เมื่อทำการเปลี่ยนแปลงโค้ดเล็กน้อยใน compiler ของ Zig เอง เวลาในการ build ลดลงจากประมาณ 750-850 มิลลิวินาทีด้วย linker เก่าเหลือเพียง 72-73 มิลลิวินาทีด้วย Elf2 ซึ่งแสดงถึงการปรับปรุงความเร็วในการ incremental compilation ถึง 11 เท่า

สิ่งที่น่าประทับใจมากกว่านั้นคือประสิทธิภาพนี้ใกล้เคียงกับการข้าม code generation ทั้งหมด เมื่อนักพัฒนาปิดใช้งานทั้ง backend และ linker อย่างสมบูรณ์ incremental build ใช้เวลาประมาณ 69-70 มิลลิวินาที linker ใหม่เพิ่ม overhead เพียง 4% เมื่อเปรียบเทียบกับการ type-checking เพียงอย่างเดียว ทำให้ขั้นตอน build แบบ -Dno-bin แบบดั้งเดิมเกือบจะไม่จำเป็น

การเปรียบเทียบประสิทธิภาพ: Linker เก่า vs ใหม่

สถานการณ์ Linker เก่า Linker ใหม่ (Elf2) Type-check เท่านั้น
การ build ครั้งแรก 18s 18s 17s
การ build แบบ Incremental ครั้งที่ 1 754ms 73ms 70ms
การ build แบบ Incremental ครั้งที่ 2 858ms 72ms 69ms
การปรับปรุงความเร็ว Baseline เร็วขึ้น 11 เท่า เร็วขึ้น 11.6 เท่า
Overhead เทียบกับ type-check ~1100% ~4% 0%

ชุมชนถกเถียงปรัชญาการออกแบบของ Zig

การประกาศ linker ใหม่ได้จุดประกายการอพิพากษาที่กว้างขึ้นเกี่ยวกับทิศทางโดยรวมของ Zig นักพัฒนาบางคนชื่นชมแนวทางแบบ vertically integrated ของภาษานี้ โดยสังเกตเห็นว่าคอมโพเนนต์ที่กำหนดเองเช่น linker นี้ช่วยให้เกิดการปรับปรุงประสิทธิภาพที่เป็นเอกลักษณ์ซึ่งเป็นไปไม่ได้กับ toolchain แบบดั้งเดิม ส่วนคนอื่นแสดงความกังวลเกี่ยวกับตัวเลือกการออกแบบบางอย่าง โดยเฉพาะเรื่องการจัดการ interface และสิ่งที่บางคนมองว่าเป็นความซับซ้อนที่ไม่จำเป็น

ยิ่งฟังเรื่อง Zig มากเท่าไหร่ ยิ่งชื่นชมมากเท่านั้น stack แบบ vertically integrated (ด้วย custom linker และ code-generation backends) โดดเด่นสำหรับผมในฐานะฟีเจอร์ที่น่าสนใจจริงๆ ที่ช่วยให้เกิดการปรับปรุงประสิทธิภาพที่น่าสนใจ

ชุมชนยังคงแบ่งแยกเกี่ยวกับการเปลี่ยนแปลงล่าสุดในระบบ IO ของ Zig ซึ่งตอนนี้พึ่งพา interface มากขึ้นแม้ว่าภาษานี้จะไม่สนับสนุนการใช้งานมาโดยตลอด สิ่งนี้สร้างความตึงเครียดระหว่างปรัชญาที่ระบุไว้ของภาษากับความต้องการในการใช้งานจริง

ศักยภาพ Cross-Platform Toolchain

นอกเหนือจากการพัฒนา Zig แบบบริสุทธิ์แล้ว linker ใหม่ยังทำให้ Zig ใกล้เคียงกับการเป็นโซลูชัน cross-compilation ที่สมบูรณ์สำหรับโปรเจกต์ C และ C++ นักพัฒนาหลายคนใช้ Zig เป็น drop-in replacement สำหรับ cross-compiler แบบดั้งเดิมอยู่แล้วเนื่องจากความเรียบง่ายเมื่อเปรียบเทียบกับการจัดการ toolchain แยกต่างหากสำหรับแพลตฟอร์มต่างๆ

Linker Elf2 ปัจจุบันทำงานกับ ELF target และเปิดใช้งานโดยอัตโนมัติเมื่อใช้โหมด incremental compilation นักพัฒนายังสามารถเปิดใช้งานด้วยตนเองผ่าน command-line flag หรือการตั้งค่า build script เมื่อการสนับสนุนขยายไปยังแพลตฟอร์มและรูปแบบไฟล์มากขึ้น สิ่งนี้อาจทำให้ Zig กลายเป็นทางเลือกที่จริงจังต่อการรวมกัน toolchain ที่มีอยู่

การปรับปรุงประสิทธิภาพแสดงให้เห็นว่าการออกแบบ linker สมัยใหม่สามารถขจัดคอขวดแบบดั้งเดิมในวงจรการพัฒนาได้ ด้วย incremental build ที่ใช้เวลาต่ำกว่า 100 มิลลิวินาที นักพัฒนาสามารถรักษา feedback loop ที่แน่นขึ้นมากในระหว่างเซสชันการเขียนโค้ดที่ใช้งานอยู่

อ้างอิง: Elf2: create a new linker from scratch #25299