ไลบรารี string formatting ของ C++ ขนาดเพียง 65 บรรทัดกำลังได้รับความสนใจจากชุมชนนักพัฒนาหลังจากการทดสอบ benchmark แสดงให้เห็นว่าสามารถคอมไพล์ได้เร็วกว่าไลบรารี fmt ยอดนิยมอย่างมีนัยสำคัญ ทางเลือกที่มีน้ำหนักเบานี้ได้จุดประกายการอภิปรายเกี่ยวกับการแลกเปลี่ยนระหว่างความสมบูรณ์ของฟีเจอร์และความเร็วในการคอมไพล์ในการพัฒนา C++ สมัยใหม่
คุณลักษณะของไลบรารี
- ขนาดโค้ด: 65 บรรทัดของ C++
- การพึ่งพา: Standard library เท่านั้น
- ใบอนุญาต: MIT
- คุณสมบัติ: การจัดรูปแบบประเภทพื้นฐาน, คอนเทนเนอร์ (vector, map, tuple), รองรับประเภทที่กำหนดเอง
- สิ่งที่ขาดหายไป: การแปลเป็นภาษาท้องถิ่น, การตรวจสอบความถูกต้องในเวลาคอมไพล์, การจัดการข้อผิดพลาดอย่างครอบคลุม
การปรับปรุงเวลาคอมไพล์อย่างมาก
การ benchmark ล่าสุดเผยให้เห็นความแตกต่างด้านประสิทธิภาพที่โดดเด่นในความเร็วการคอมไพล์ การทดสอบแสดงให้เห็นว่าไลบรารี formatting ขนาดเล็กสามารถคอมไพล์ได้ในเวลาเพียง 72 มิลลิวินาทีเมื่อเปรียบเทียบกับ fmt ที่ใช้เวลา 198 มิลลิวินาที ซึ่งเป็นการปรับปรุงที่ดีขึ้นเกือบสามเท่า ความแตกต่างที่สำคัญนี้ได้ดึงดูดความสนใจของนักพัฒนาที่ให้ความสำคัญกับเวลา build ที่เร็ว โดยเฉพาะผู้ที่ทำงานกับ codebase ขนาดใหญ่ที่ความเร็วการคอมไพล์ส่งผลโดยตรงต่อผลิตภาพ
ช่วงความแตกต่างด้านประสิทธิภาพจะยิ่งมีนัยสำคัญมากขึ้นใน workflow การพัฒนาที่เกี่ยวข้องกับการคอมไพล์ซ้ำบ่อยครั้ง สำหรับทีมที่ปฏิบัติตาม test-driven development หรือ continuous integration เวลาที่ประหยัดได้เหล่านี้สามารถสะสมเป็นชั่วโมงของเวลาพัฒนาที่ประหยัดได้ตลอดระยะเวลาของโครงการ
การเปรียบเทียบความเร็วในการ Compile
- Lightweight library: เวลาในการ compile 72ms
- fmt library: เวลาในการ compile 198ms
- การปรับปรุงประสิทธิภาพ: การ compilation เร็วขึ้น ~2.75 เท่า
ความท้าทายในการรับใช้ Standard Library
การอภิปรายได้เน้นย้ำถึงความท้าทายที่ยังคงมีอยู่ในการรับใช้ C++ standard library แม้ว่า std::format จะมีให้ใช้ตั้งแต่ C++20 และ std::print ตั้งแต่ C++23 นักพัฒนาจำนวนมากยังคงพึ่งพาไลบรารีจากบุคคลที่สาม ปัญหานี้เกิดจากความแตกต่างในการสนับสนุนของคอมไพเลอร์ - GCC ได้สนับสนุนฟีเจอร์เหล่านี้ตั้งแต่เวอร์ชัน 13 และ Clang ตั้งแต่เวอร์ชัน 17 แต่การ implement ของ Microsoft Visual C++ ยังล้าหลัง
สิ่งนี้สร้างปัญหาที่คุ้นเคยใน C++ ecosystem ที่ฟีเจอร์ภาษาใหม่ยังคงไม่ได้รับการใช้งานเต็มที่เนื่องจากข้อกังวลด้านความเข้ากันได้ องค์กรจำนวนมากยังคงใช้คอมไพเลอร์เวอร์ชันเก่า ทำให้ฟีเจอร์ standard library ไม่สามารถใช้งานได้จริงแม้ว่าจะเป็นส่วนหนึ่งของข้อกำหนดภาษาอย่างเป็นทางการแล้วก็ตาม
ไทม์ไลน์การรองรับ C++ Standard Library
- std::format: พร้อมใช้งานตั้งแต่ C++20
- std::print: พร้อมใช้งานตั้งแต่ C++23
- การรองรับของ GCC : เวอร์ชัน 13+ (2023)
- การรองรับของ Clang : เวอร์ชัน 17+ (2023)
- การรองรับของ MSVC : มีข้อจำกัด/อยู่หลัง feature flags
ขนาด Binary และข้อจำกัดด้านทรัพยากร
นอกเหนือจากเวลาคอมไพล์แล้ว นักพัฒนายังได้แสดงความกังวลเกี่ยวกับการขยายตัวของ binary จากไลบรารี formatting ที่มีฟีเจอร์ครบครัน การพิจารณานี้จะมีความสำคัญสำหรับแพลตฟอร์มอย่าง WebAssembly ที่ทุกไบต์มีความสำคัญ หรือระบบฝังตัวที่มีข้อจำกัดด้านหน่วยความจำที่เข้มงวด แนวทางขนาดเล็กนี้เสนอทางกลางระหว่างข้อจำกัดของ printf และ overhead ของโซลูชัน formatting ที่ครอบคลุม
ไลบรารีขนาดเล็กนี้แสดงให้เห็นว่าความต้องการ formatting พื้นฐานสามารถตอบสนองได้โดยไม่ต้องมีความซับซ้อนของทางเลือกที่มีฟีเจอร์ครบครัน แม้ว่าจะต้องเสียสละฟีเจอร์ขั้นสูงอย่างการสนับสนุน localization และการจัดการข้อผิดพลาดที่ครอบคลุม
การตอบสนองของชุมชนและการพิจารณาเชิงปฏิบัติ
ความคิดเห็นของนักพัฒนาเผยให้เห็นมุมมองที่หลากหลายต่อแนวทางขนาดเล็ก ในขณะที่บางคนชื่นชมความเรียบง่ายและประโยชน์ด้านประสิทธิภาพ คนอื่นๆ ตั้งคำถามเกี่ยวกับผลกระทบด้านความปลอดภัยและฟีเจอร์ที่ขาดหายไป ไลบรารีนี้ขาดการตรวจสอบ format string ในเวลาคอมไพล์และการตรวจจับข้อผิดพลาดที่ครอบคลุม ซึ่งเป็นฟีเจอร์ที่ไลบรารีที่เป็นผู้ใหญ่มีให้เพื่อป้องกันความล้มเหลวในขณะรันไทม์
ด้วยขนาด 65 บรรทัด หากใบอนุญาตเหมาะสม คุณสามารถคัดลอกมันได้เหมือนกับคำตอบจาก StackOverflow
ความรู้สึกนี้สะท้อนแนวโน้มที่เพิ่มขึ้นในการฝัง dependency ขนาดเล็กโดยตรงเข้าไปใน codebase แทนที่จะจัดการ dependency ของไลบรารีภายนอก โดยเฉพาะอย่างยิ่งเมื่อพิจารณาถึงความกังวลด้านความปลอดภัยของ supply chain ในอุตสาหกรรมซอฟต์แวร์เมื่อเร็วๆ นี้
การเกิดขึ้นของทางเลือกขนาดเล็กนี้แสดงให้เห็นถึงความตึงเครียดที่ยังคงมีอยู่ในการพัฒนา C++ ระหว่างความอุดมสมบูรณ์ของฟีเจอร์และประสิทธิภาพ ในขณะที่ไลบรารีที่มีชื่อเสียงอย่าง fmt ให้ฟังก์ชันการทำงานที่ครอบคลุมและการรับประกันความปลอดภัย ทางเลือกที่เรียบง่ายสามารถให้ข้อได้เปรียบที่สำคัญในกรณีการใช้งานเฉพาะที่ความเร็วการคอมไพล์และขนาด binary มีความสำคัญมากกว่าฟีเจอร์ขั้นสูง