4 คะแนน โดย GN⁺ 2025-03-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ใน crate flate2
    • C → คอมไพล์เป็นไดนามิกไลบรารีแล้วนำไปใช้ได้

1 ความคิดเห็น

 
GN⁺ 2025-03-17
ความเห็นจาก Hacker News
  • ทำให้รู้ว่าตัวเองรู้จัก Rust อยู่แล้ว

    • เคยคิดว่าเป้าหมายของ Rust คือความปลอดภัย แต่ไลบรารีนี้กลับใช้คีย์เวิร์ด unsafe เยอะมาก
    • เลยสงสัยว่าจุดไหนที่ความแตกต่างระหว่าง C กับ Rust เริ่มไม่มีความหมาย
    • ถ้าใช้อินไลน์แอสเซมบลี ทั้งสองภาษาก็สามารถสร้าง machine code แบบเดียวกันได้
    • สงสัยว่าคอมไพเลอร์ของ Rust ปรับแต่งประสิทธิภาพได้ดีกว่าคอมไพเลอร์ C หรือไม่
  • คำว่า "เร็วกว่า C" สุดท้ายก็มักจะหมายถึงการออกแบบ การอิมพลีเมนต์ อัลกอริทึม ฯลฯ ที่ต่างกัน

    • มันอาจเร็วกว่าอิมพลีเมนต์ที่มีอยู่แล้วก็จริง แต่คำกล่าวว่า "เร็วกว่า C" ฟังดูแปลก
  • zippy ใน Nim อ้างว่าเร็วกว่า zlib อยู่ 1.5 ถึง 2 เท่า

    • ในโลก C ก็มี zlib ที่เร็วกว่าเวอร์ชันติดตั้งมาตรฐานอยู่แล้ว
    • zlib ทุกวันนี้ค่อนข้างล้าสมัย แต่ก็ยังได้รับความนิยมอยู่
    • มันถูกใช้เป็นพื้นฐานของฟอร์แมตใหม่ ๆ ที่เป็นมิตรกับการประมวลผลแบบขนานมากกว่า
  • สงสัยว่าประสิทธิภาพของ Rust เกี่ยวกับตัวภาษา Rust เองจริงหรือไม่ หรือแค่อิมพลีเมนต์ได้ถูกปรับแต่งดีกว่าเวอร์ชันภาษา C อื่น ๆ

    • มีกรณีของการเรียงลำดับที่ C++ ให้ประสิทธิภาพดีกว่า C อย่างสม่ำเสมอ
    • เลยสงสัยว่าระหว่าง Rust กับ C ก็มีอะไรคล้ายกันหรือไม่
  • Chromium ใช้ zlib เพราะอัลกอริทึมที่อยู่ในมาตรฐาน

    • ถ้าเลือกอัลกอริทึมที่ดีกว่า ก็อาจได้ประสิทธิภาพที่ดีกว่า
    • Zstandard เร็วกว่าและบีบอัดได้ดีกว่า
    • LZ4 เร็วกว่าเยอะมาก แต่ขนาดไฟล์ไม่ได้เล็ก
  • อนุญาตให้ใช้ Zstandard และไดเจสต์ blake3 ได้

  • จะบอกว่า Rust เร็วพอ ๆ กับ C น่าจะถูกต้องกว่า

    • ถึงอย่างนั้นก็ยังถือเป็นความสำเร็จครั้งใหญ่
  • ไลบรารีไหนคอมไพล์ได้เร็วกว่า

    • ไลบรารีไหนมี dependency น้อยกว่า
    • ขนาดของแต่ละไลบรารีเท่ากันไหม และตัวไหนเล็กกว่า
  • ผู้ใช้ Rust ชอบเปรียบเทียบ Rust กับ C แต่ผู้ใช้ C ไม่ค่อยเปรียบเทียบ C กับ Rust

  • เมื่อต้องพูดถึงภาษาระบบที่คอมไพล์แล้ว ตัวภาษาเองแทบไม่มีผลต่อความเร็ว

    • เวอร์ชันที่ปรับแต่งดีจะควบคุมการจัดสรรหน่วยความจำ ใช้รูปแบบการเข้าถึงหน่วยความจำที่ดี และใช้ SIMD กับมัลติเธรด จนสามารถเร็วกว่าได้เกิน 100 เท่าอย่างไม่ยาก
    • แค่การเข้าถึงหน่วยความจำที่ดีกว่าก็อาจทำให้โปรแกรมเร็วขึ้นเกิน 20 เท่าได้แล้ว
  • สิ่งที่หมายถึงจริง ๆ คืออิมพลีเมนต์นี้เร็วกว่าเวอร์ชันใน C

    • ไม่มีอะไรที่เรียกว่า "เร็วกว่า C"