การใช้งาน Rust ใน bzip2 ช่วยเพิ่มประสิทธิภาพ 15% พร้อมกำจัด Dependencies ของ C

ทีมชุมชน BigGo
การใช้งาน Rust ใน bzip2 ช่วยเพิ่มประสิทธิภาพ 15% พร้อมกำจัด Dependencies ของ C

ไลบรารีการบีบอัดข้อมูล bzip2 ได้รับการอัปเกรดครั้งใหญ่ด้วยการเปิดตัวเวอร์ชัน 0.6.0 ซึ่งเปลี่ยนจากการใช้งาน C มาเป็นเวอร์ชัน Rust แบบบริสุทธิ์ที่เรียกว่า libbz2-rs-sys การเปลี่ยนแปลงครั้งนี้ไม่ได้เป็นเพียงแค่การเปลี่ยนภาษาโปรแกรมเท่านั้น แต่ยังให้ประสิทธิภาพที่ดีขึ้นอย่างเห็นได้ชัดและแก้ไขปัญหาการพัฒนาที่มีมานานหลายประการ

ประสิทธิภาพที่ดีขึ้นในทุกด้าน

การใช้งาน Rust แบบใหม่แสดงให้เห็นการปรับปรุงความเร็วอย่างสม่ำเสมอทั้งในงานการบีบอัดและการขยายข้อมูล การดำเนินการบีบอัดข้อมูลเห็นผลการปรับปรุงที่น่าประทับใจที่สุด โดยมีการปรับปรุงประสิทธิภาพตั้งแต่ 9% ถึง 15% ในไฟล์ประเภทต่างๆ และระดับการบีบอัดที่แตกต่างกัน การขยายข้อมูลก็ได้รับประโยชน์อย่างมีนัยสำคัญเช่นกัน โดยแสดงการเพิ่มความเร็วระหว่าง 4% ถึง 10% ขึ้นอยู่กับไฟล์ที่กำลังประมวลผล

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

การปรับปรุงประสิทธิภาพ

ประเภทการดำเนินการ ไฟล์ การใช้งาน C การใช้งาน Rust การปรับปรุง
การบีบอัด sample3.ref (level 1) 38.51M cycles 33.53M cycles -14.87%
การบีบอัด silesia-smalltar (level 1) 3.43G cycles 3.00G cycles -14.30%
การบีบอัด silesia-smalltar (level 9) 3.47G cycles 3.17G cycles -9.66%
การคลายการบีบอัด sample3.bz2 2.53M cycles 2.42M cycles -4.48%
การคลายการบีบอัด sample1.bz2 9.63M cycles 8.86M cycles -8.63%
การคลายการบีบอัด sample2.bz2 20.47M cycles 19.02M cycles -7.67%
การคลายการบีบอัด re2-exhaustive.txt.bz2 1.89G cycles 1.76G cycles -7.65%
การคลายการบีบอัด zip64support.tar.bz2 2.32G cycles 2.116G cycles -10.00%

การ Cross-Compilation ที่ง่ายขึ้น

หนึ่งในข้อได้เปรียบที่สำคัญที่สุดของการเขียนใหม่ด้วย Rust คือการกำจัดปัญหาการ cross-compilation การสร้าง bzip2 สำหรับแพลตฟอร์มต่างๆ เช่น WebAssembly, Windows หรือ Android ในอดีตมักต้องการการกำหนดค่า toolchain ที่ซับซ้อนและอาจล้มเหลวในลักษณะที่ยากต่อการแก้ไขข้อบกพร่อง การใช้งาน Rust แบบบริสุทธิ์จะขจัดความซับซ้อนเหล่านี้ทั้งหมด ทำให้นักพัฒนาสามารถคอมไพล์สำหรับแพลตฟอร์มเป้าหมายใดๆ ได้โดยไม่ต้องตั้งค่าเพิ่มเติม

การเปลี่ยนแปลงนี้เป็นประโยชน์อย่างยิ่งสำหรับนักพัฒนาที่ทำงานในโครงการหลายแพลตฟอร์มหรือผู้ที่มุ่งเป้าไปที่ระบบฝังตัวที่ความน่าเชื่อถือของ cross-compilation มีความสำคัญ

ประโยชน์ด้านความปลอดภัยและการบำรุงรักษา

การเปลี่ยนไปใช้ Rust นำมาซึ่งการปรับปรุงด้านความปลอดภัยที่สำคัญผ่านการรับประกันความปลอดภัยของหน่วยความจำและความสามารถในการรันโค้ดภายใต้ MIRI (ตัวแปลของ Rust สำหรับตรวจจับพฤติกรรมที่ไม่ได้กำหนดไว้) การตรวจสอบความปลอดภัยอิสระพบเพียงข้อบกพร่องทางตรรกะเล็กน้อยเพียงหนึ่งข้อ คือข้อผิดพลาด off-by-one โดยไม่พบช่องโหว่ด้านความปลอดภัยที่สำคัญ

การใช้งานใหม่ยังขจัดความขัดแย้งในการส่งออกสัญลักษณ์ที่อาจเกิดขึ้นเมื่อไลบรารี C หลายตัวกำหนดสัญลักษณ์เดียวกัน โดยค่าเริ่มต้น เวอร์ชัน Rust จะเก็บสัญลักษณ์ไว้เป็นส่วนตัว ป้องกันการชนกันของชื่อเหล่านี้ในขณะที่ยังคงเสนอตัวเลือกในการส่งออกสัญลักษณ์เมื่อจำเป็น

ประโยชน์ทางเทคนิคที่สำคัญ

  • รองรับการคอมไพล์ข้ามแพลตฟอร์ม: ใช้งานได้ทันทีสำหรับ WebAssembly , Windows , Android และแพลตฟอร์มอื่น ๆ
  • ความปลอดภัยของหน่วยความจำ: สามารถทำงานภายใต้ MIRI เพื่อตรวจจับพฤติกรรมที่ไม่ได้กำหนดไว้
  • การจัดการสัญลักษณ์: ไม่มีการส่งออกสัญลักษณ์โดยค่าเริ่มต้น ป้องกันความขัดแย้งในการตั้งชื่อ
  • การตรวจสอบความปลอดภัย: พบข้อบกพร่องทางตรรกะเพียงหนึ่งจุดเล็กน้อย ไม่มีช่องโหว่ที่สำคัญ
  • การบำรุงรักษา: ง่ายต่อการบำรุงรักษาและตรวจสอบเมื่อเปรียบเทียบกับการใช้งาน C
  • ความเข้ากันได้: ให้ความเข้ากันได้กับ C ABI สำหรับโปรเจกต์ที่มีอยู่

การตอบสนองของชุมชนและผลกระทบในอนาคต

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

อย่างไรก็ตาม การเปลี่ยนแปลงนี้ยังเน้นให้เห็นการถกเถียงที่ดำเนินต่อไปเกี่ยวกับความสมดุลระหว่างนวัตกรรมและความเสถียรในส่วนประกอบหลักของระบบ แม้ว่าการปรับปรุงประสิทธิภาพจะเป็นสิ่งที่ต้อนรับ แต่สมาชิกชุมชนบางคนตั้งคำถามว่าการเขียนเครื่องมือที่มีการยอมรับอย่างดีใหม่เป็นการใช้ทรัพยากรการพัฒนาอย่างมีประสิทธิภาพมากที่สุดหรือไม่

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

อ้างอิง: bzip2 crate switches from C to 100% rust