Crate bzip2 เปลี่ยนจาก C ไปเป็น Rust 100%
(trifectatech.org)- crate bzip2 แทนที่ การพึ่งพาโค้ด C ทั้งหมด 100% ด้วยอิมพลีเมนเทชัน Rust
- ประสิทธิภาพ โดยรวมดีขึ้นจากเดิม และคอมไพล์ข้ามแพลตฟอร์มได้ง่ายขึ้น
- อิมพลีเมนเทชัน Rust ปรับปรุงทั้งความเร็วในการบีบอัดและคลายการบีบอัดเมื่อเทียบกับ เวอร์ชัน C
- ปัญหาการพึ่งพาไลบรารี เช่น การชนกันของสัญลักษณ์ ลดลงอย่างมาก
- ผ่านการตรวจสอบความปลอดภัยและแก้ไข บั๊กเชิงตรรกะที่สำคัญ แล้ว จึงยืนยันความเสถียรได้
เปิดตัว bzip2 crate 0.6.0 และเปลี่ยนสู่ Rust
- วันนี้มีการปล่อย bzip2 เวอร์ชัน 0.6.0
- ตอนนี้โดยค่าเริ่มต้นจะใช้อิมพลีเมนเทชันอัลกอริทึม bzip2 บนพื้นฐาน Rust ที่พัฒนาขึ้นเองคือ libbz2-rs-sys
- การเปลี่ยนแปลงนี้ทำให้ bzip2 crate เร็วขึ้นและคอมไพล์ข้ามแพลตฟอร์มได้ง่ายขึ้น
- crate
libbz2-rs-sysสามารถบิลด์เป็นไลบรารีไดนามิกแบบ C ได้ด้วย ทำให้โปรเจกต์ C สามารถใช้ประโยชน์จากประสิทธิภาพที่ดีขึ้นนี้ได้
ทำไมถึงมีการเปลี่ยนแปลงนี้?
- อัลกอริทึม bzip2 ถูกสร้างขึ้นในยุค 90 และแม้ปัจจุบันจะไม่ได้ใช้อย่างแพร่หลายแล้ว แต่ยังจำเป็นต่อ การทำตามสเปก ในหลายโปรโตคอลและไลบรารี
- หลายโปรเจกต์อาจไม่ได้พึ่งพา bzip2 โดยตรง แต่ก็ยังพึ่งพาอยู่ลึกลงไปใน dependency tree
- จากประสบการณ์ที่สะสมมาจาก zlib-rs เราจึงทำให้อิมพลีเมนเทชัน bzip2 ทันสมัยขึ้นในครั้งนี้
- รายละเอียดการอิมพลีเมนต์
libbz2-rs-sysกล่าวไว้ในบล็อกโพสต์ก่อนหน้าแล้ว ที่นี่จะดูเฉพาะ ข้อดี ของการเปลี่ยนแปลงครั้งนี้
ประสิทธิภาพที่ดีขึ้น
- อิมพลีเมนเทชัน Rust โดยรวมให้ ประสิทธิภาพ สูงกว่า เวอร์ชัน C
- ในบางกรณีอาจได้ผลลัพธ์ใกล้เคียงกัน แต่ไม่มีกรณีที่ช้ากว่า
- ประสิทธิภาพการบีบอัด: bzip2 มีตัวเลือก level แต่ส่งผลต่อประสิทธิภาพไม่มากนัก
- จากผลทดสอบกับไฟล์ตัวอย่างหลัก เวอร์ชัน Rust เร็วขึ้นมากกว่า 10%
การบีบอัด:
| ไฟล์ | C(รอบการทำงาน) | Rust(รอบการทำงาน) | การเปลี่ยนแปลงสัมพัทธ์ |
|---|---|---|---|
| sample3.ref (level 1) | 38.51M | 33.53M | -14.87% |
| silesia-small.tar (level 1) | 3.43G | 3.00G | -14.30% |
| silesia-small.tar (level 9) | 3.47G | 3.17G | -9.66% |
ในการคลายการบีบอัดก็แสดงให้เห็นว่าประสิทธิภาพดีขึ้นในทุกกรณี:
| ไฟล์ | C(รอบการทำงาน) | Rust(รอบการทำงาน) | การเปลี่ยนแปลงสัมพัทธ์ |
|---|---|---|---|
| sample3.bz2 | 2.53M | 2.42M | -4.48% |
| sample1.bz2 | 9.63M | 8.86M | -8.63% |
| sample2.bz2 | 20.47M | 19.02M | -7.67% |
| dancing-color.ps.bz2 | 87.46M | 83.16M | -5.17% |
| re2-exhaustive.txt.bz2 | 1.89G | 1.76G | -7.65% |
| zip64support.tar.bz2 | 2.32G | 2.11G | -10.00% |
อย่างไรก็ตาม ในสภาพแวดล้อม macOS บางครั้งอาจมีการเปลี่ยนแปลงของตัวเลขการคลายการบีบอัดเกิดขึ้น ซึ่งวิเคราะห์ได้ยากจากข้อจำกัดของเครื่องมือวัดประสิทธิภาพ
รองรับการคอมไพล์ข้ามแพลตฟอร์ม
- การคอมไพล์ข้ามแพลตฟอร์มของโปรเจกต์ Rust ที่มี dependency เป็น C มักทำงานได้ดีเพราะอาศัย crate
ccแต่หากล้มเหลวจะดีบักได้ยากมาก - ในขั้นตอนลิงก์กับ system library มักเกิดปัญหาที่ไม่คาดคิดได้ง่าย และในบางสภาพแวดล้อมรวมถึงการบิลด์ WebAssembly ก็กลายเป็นอุปสรรคจริงจัง
- การเปลี่ยนมาใช้อิมพลีเมนเทชัน Rust ทำให้ปัญหาที่เกี่ยวข้องกับ C หายไปทั้งหมด
- ตอนนี้สามารถคอมไพล์ข้ามแพลตฟอร์มไปยัง Windows, Android, WebAssembly และอื่น ๆ ได้โดยไม่มีข้อสังเกตพิเศษ
- นี่เป็นข้อดีใหญ่ไม่ใช่แค่ต่อประสบการณ์ผู้ใช้ แต่รวมถึงมุมมองด้านการบำรุงรักษาด้วย
ไม่มีการชนกันของสัญลักษณ์ (export) โดยค่าเริ่มต้น
- ในกรณี dependency แบบ C จำเป็นต้อง export สัญลักษณ์จากบล็อกภายนอกของ Rust ทำให้หาก dependency อื่น export สัญลักษณ์เดียวกันก็จะเกิดการชนกัน
libbz2-rs-sysถูกออกแบบมาให้ ไม่ export สัญลักษณ์โดยค่าเริ่มต้น- ดังนั้นจึงไม่เกิดปัญหาสัญลักษณ์ชนกับไลบรารีภายนอกอื่น ๆ และหากจำเป็นก็สามารถเปิด export ได้ผ่าน feature flag
รันการทดสอบบนพื้นฐาน MIRI
- หากต้องการอิมพลีเมนต์ bzip2 ใน Rust ให้มีประสิทธิภาพสูง ก็เลี่ยงการใช้ unsafe code ไม่ได้ และการจำลองอินเทอร์เฟซ C ก็ต้องใช้ unsafe code จำนวนมากเช่นกัน
- โชคดีที่สามารถรันและทดสอบโค้ดนี้ในสภาพแวดล้อม MIRI ได้
- ยิ่งไปกว่านั้น ตอนนี้ไลบรารีหรือแอปพลิเคชันระดับบนที่ใช้ bzip2 ก็สามารถทดสอบด้วย MIRI ได้เช่นกัน
สรุป
ตอนนี้ bzip2 crate เร็วขึ้นแล้ว และมอบประสบการณ์ที่ดีขึ้นอย่างเป็นธรรมชาติจนแทบไม่ต้องใส่ใจมันอีกต่อไป
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News