Zlib-rs เร็วกว่า C
(trifectatech.org)- zlib-rs คืออิมพลีเมนเทชัน zlib ที่พัฒนาด้วย Rust สำหรับการบีบอัดข้อมูล โดยเพิ่งออกเวอร์ชัน 0.4.2 ซึ่งมาพร้อมการปรับปรุงประสิทธิภาพครั้งใหญ่
- ปัจจุบันเป็น อิมพลีเมนเทชัน zlib ที่เข้ากันได้กับ API ที่เร็วที่สุด และโดดเด่นกว่าโซลูชันคู่แข่งโดยเฉพาะด้านประสิทธิภาพ การคลายการบีบอัด
- การปรับปรุงประสิทธิภาพหลัก: เลือกใช้อิมพลีเมนเทชัน SIMD ที่เหมาะสมที่สุดอัตโนมัติขณะรันไทม์, ใช้การปรับแต่ง DFA เป็นต้น
การทำงานหลายเวอร์ชัน (Multiversioning)
- เลือกเวอร์ชันของฟังก์ชันที่เร็วที่สุดโดยอัตโนมัติตาม CPU ในขณะรันไทม์
- ใน Rust ยังไม่มีการรองรับ multiversioning โดยปริยาย จึงต้องอิมพลีเมนต์ด้วยตนเอง
- มอบประสิทธิภาพสูงสุดพร้อมลด runtime overhead ของโค้ดให้ต่ำที่สุด
การปรับแต่ง DFA (Deterministic Finite Automata)
- ภาษา C ใช้ implicit fallthrough ในคำสั่ง
switchเพื่อเพิ่มประสิทธิภาพ - Rust ไม่มีกลไกที่ใกล้เคียงกัน ทำให้ประสิทธิภาพลดลง
- ใช้ออปชัน
-Cllvm-args=-enable-dfa-jump-threadของ LLVM → กู้คืนประสิทธิภาพได้ - แม้ยังไม่รวมอยู่ในการตั้งค่าปริยายของ LLVM แต่มีแผนจะเปิดใช้งานเป็นค่าเริ่มต้นใน Rustc ในอนาคต
การเปรียบเทียบประสิทธิภาพจากเบนช์มาร์ก
1. เปรียบเทียบกับ zlib-ng
- zlib-rs ทำงานได้เร็วกว่า zlib-ng ในอินพุตเกือบทุกขนาด
- โดยเฉพาะที่ อินพุต 1KB เร็วขึ้นราว 10% และที่ อินพุต 65KB เร็วขึ้นราว 6%
- แม้จะช้ากว่าเล็กน้อยในอินพุตขนาดเล็กที่สุด แต่โดยรวมยังเหนือกว่าในด้านประสิทธิภาพ
ตัวอย่างเช่น:
- เมื่อขนาดอินพุตเป็น 4 ไบต์ zlib-ng จะเร็วกว่าเล็กน้อย แต่แทบไม่มีผลในงานใช้งานจริง
- เมื่อขนาดอินพุตเป็น 1KB zlib-rs เร็วขึ้นประมาณ 10%
- เมื่อขนาดอินพุตเป็น 65KB zlib-rs เร็วขึ้นประมาณ 6%
→ เหนือกว่า zlib-ng อย่างชัดเจนในชังก์ขนาดใหญ่
2. เปรียบเทียบกับ zlib-chromium
- ในชังก์ขนาดเล็ก zlib-chromium เร็วกว่า
- แต่ใน ชังก์ขนาดใหญ่ zlib-rs เหนือกว่า
- สำหรับอินพุตขนาดทั่วไป zlib-rs ให้ประสิทธิภาพที่ดีกว่า
ตัวอย่างเช่น:
- เมื่อขนาดอินพุตเป็น 4 ไบต์ zlib-chromium เร็วขึ้นประมาณ 12%
- เมื่อขนาดอินพุตเป็น 16 ไบต์ zlib-chromium เร็วขึ้นประมาณ 6%
- เมื่อขนาดอินพุต ตั้งแต่ 1KB ขึ้นไป zlib-rs มีประสิทธิภาพเหนือกว่า
→ zlib-rs เหนือกว่าในขนาดที่ใช้งานทั่วไป
การเปรียบเทียบประสิทธิภาพการบีบอัด
- ประสิทธิภาพการบีบอัดกำลังอยู่ระหว่างการปรับปรุง และผลลัพธ์ยังออกมาคละกัน
- ที่ระดับการบีบอัดเริ่มต้น (6) ดีขึ้น 6% และ ที่ระดับการบีบอัดสูงสุด (9) ประสิทธิภาพดีขึ้น 13%
- แต่ในระดับการบีบอัดอื่น ๆ zlib-ng ยังเร็วกว่า
ตัวอย่างเช่น:
- ที่ ระดับการบีบอัด 6 zlib-rs เร็วกว่า zlib-ng ประมาณ 6%
- ที่ ระดับการบีบอัด 9 zlib-rs เร็วกว่า zlib-ng ประมาณ 13%
- แต่ที่ ระดับการบีบอัด 1~4 zlib-ng ยังเหนือกว่า
บทสรุป
- zlib-rs มีประสิทธิภาพเหนือกว่า zlib-ng และ zlib-chromium ในด้าน การคลายการบีบอัด
- ประสิทธิภาพการบีบอัดยังคงได้รับการปรับปรุง และเริ่มเห็นการพัฒนาที่มีนัยสำคัญในระดับการบีบอัดหลัก ๆ
- สามารถใช้ได้ทั้งในโปรเจ็กต์ Rust และ C
- Rust → ใช้แฟลก
zlib-rsใน crateflate2 - C → คอมไพล์เป็นไดนามิกไลบรารีแล้วนำไปใช้ได้
- Rust → ใช้แฟลก
1 ความคิดเห็น
ความเห็นจาก Hacker News
ทำให้รู้ว่าตัวเองรู้จัก Rust อยู่แล้ว
unsafeเยอะมากคำว่า "เร็วกว่า C" สุดท้ายก็มักจะหมายถึงการออกแบบ การอิมพลีเมนต์ อัลกอริทึม ฯลฯ ที่ต่างกัน
zippyใน Nim อ้างว่าเร็วกว่าzlibอยู่ 1.5 ถึง 2 เท่าzlibที่เร็วกว่าเวอร์ชันติดตั้งมาตรฐานอยู่แล้วzlibทุกวันนี้ค่อนข้างล้าสมัย แต่ก็ยังได้รับความนิยมอยู่สงสัยว่าประสิทธิภาพของ Rust เกี่ยวกับตัวภาษา Rust เองจริงหรือไม่ หรือแค่อิมพลีเมนต์ได้ถูกปรับแต่งดีกว่าเวอร์ชันภาษา C อื่น ๆ
Chromium ใช้
zlibเพราะอัลกอริทึมที่อยู่ในมาตรฐานZstandardเร็วกว่าและบีบอัดได้ดีกว่าLZ4เร็วกว่าเยอะมาก แต่ขนาดไฟล์ไม่ได้เล็กอนุญาตให้ใช้
Zstandardและไดเจสต์blake3ได้จะบอกว่า Rust เร็วพอ ๆ กับ C น่าจะถูกต้องกว่า
ไลบรารีไหนคอมไพล์ได้เร็วกว่า
ผู้ใช้ Rust ชอบเปรียบเทียบ Rust กับ C แต่ผู้ใช้ C ไม่ค่อยเปรียบเทียบ C กับ Rust
เมื่อต้องพูดถึงภาษาระบบที่คอมไพล์แล้ว ตัวภาษาเองแทบไม่มีผลต่อความเร็ว
สิ่งที่หมายถึงจริง ๆ คืออิมพลีเมนต์นี้เร็วกว่าเวอร์ชันใน C