1. ภาพรวมและวัตถุประสงค์ของโครงการ

Eta Labs ได้เปรียบเทียบอิมพลีเมนเทชันของไลบรารีมาตรฐาน C/POSIX สำหรับ Linux โดยเน้นที่ความสามารถในการใช้งานและความเบา (“bloat”) เป็นหลัก โดยมีตัวที่นำมาเปรียบเทียบคือ musl, uClibc, dietlibc และ glibc และมีแผนจะเพิ่ม bionic และ BSD libc ในภายหลัง

2. การเปรียบเทียบการใช้หน่วยความจำและความเบา (Bloat)

  • musl และ dietlibc มีขนาดเบามากและสามารถสร้างไฟล์ปฏิบัติการที่เล็กได้ (static hello: 13k เทียบกับ 662k ของ glibc)
  • glibc มีขนาด .so รวมสูงถึง 7.9M จึงหนักที่สุด แต่ก็รวมความสามารถไว้มากมาย เช่น iconv
  • uClibc ถูกทดสอบในสถานะที่รวมฟีเจอร์เสริมไว้จำนวนมาก

3. การรับมือเมื่อทรัพยากรไม่เพียงพอ

  • musl มักรายงานความล้มเหลวอย่างชัดเจนและจัดการได้โดยไม่จบการทำงานแบบผิดปกติ
  • glibc และ uClibc ในบางกรณีอาจ abort หรือจัดการข้อยกเว้นได้ไม่เหมาะสมเมื่อหน่วยความจำไม่พอ
  • dietlibc มีบางฟีเจอร์ที่ยังไม่ได้อิมพลีเมนต์เลย หรือรองรับได้เพียงในระดับพื้นฐานมาก

4. การเปรียบเทียบประสิทธิภาพ

  • glibc ให้ประสิทธิภาพดีที่สุดในงานจัดการหน่วยความจำ (เช่น strchr, memset) และ I/O (putc/getc)
  • musl ให้ประสิทธิภาพที่สมดุลและมี overhead ต่ำ จึงถือว่าแข่งขันได้
  • dietlibc ช้ากว่ามากในงานที่เกี่ยวกับ strstr, putc/getc และการทำงานที่เกี่ยวข้องกับ thread

5. เสถียรภาพของ ABI และความเข้ากันได้ของเวอร์ชัน

  • musl และ glibc ให้เสถียรภาพและความเข้ากันได้ของ ABI แต่มีเพียง glibc เท่านั้นที่รองรับการจัดการ symbol version
  • dietlibc และ uClibc โดยรวมยังขาดความพร้อมหรือมีการรองรับแบบไม่เป็นทางการในด้านความเข้ากันได้ของ ABI และเวอร์ชัน

6. อัลกอริทึมและการอิมพลีเมนต์ภายใน

  • musl และ glibc ใช้การค้นหา substring ขั้นสูง (twoway), regular expression แบบอิง DFA และ malloc ที่เน้นประสิทธิภาพ
  • dietlibc ใช้ naive quicksort และ regex แบบ backtracking ทำให้มีข้อด้อยด้านประสิทธิภาพและความเสถียร
  • อัลกอริทึมสำหรับการเรียงลำดับและการจัดสรรหน่วยความจำของ glibc ถูกยกระดับด้วย introsort, ptmalloc เป็นต้น

7. ขอบเขตการรองรับฟีเจอร์/มาตรฐาน

  • glibc รองรับฟีเจอร์ของ C99/C11 และ POSIX แทบทั้งหมด รวมถึง locale, iconv และความสามารถด้านดีบักอย่างกว้างขวาง
  • musl อิมพลีเมนต์โดยคงการปฏิบัติตามฟีเจอร์ที่จำเป็นไว้พร้อมกับขนาดที่เล็ก
  • dietlibc มีฟีเจอร์ส่วนใหญ่ที่ยังไม่สมบูรณ์หรือขาดหาย และมีความเข้ากันได้กับ POSIX ต่ำ

8. การรองรับสถาปัตยกรรมและสภาพแวดล้อมการบิลด์

  • musl รองรับสถาปัตยกรรมหลักส่วนใหญ่ (x86, ARM, MIPS เป็นต้น) ได้อย่างกว้างขวาง และยังคำนึงถึงสภาพแวดล้อม non-MMU ด้วย
  • glibc มีการรองรับที่กว้างขวางที่สุดมาแต่เดิม และมีการเผยแพร่ใช้งานอย่างแพร่หลาย
  • dietlibc รองรับเพียงสถาปัตยกรรมขั้นต่ำ และมีข้อด้อยด้าน portability กับความยืดหยุ่นในการบิลด์

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น