Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Performance — Loop vs. Iterator

ในการตัดสินว่าจะใช้ loop หรือ iterator คุณต้องรู้ว่า implementation ไหนเร็วกว่า — เวอร์ชันของฟังก์ชัน search ที่มี loop for ชัดเจน หรือเวอร์ชันที่มี iterator

เรารัน benchmark โดยโหลดเนื้อหาทั้งหมดของ The Adventures of Sherlock Holmes โดย Sir Arthur Conan Doyle เข้า String และค้นหาคำ the ในเนื้อหา นี่คือผลของ benchmark บนเวอร์ชันของ search ที่ใช้ loop for และเวอร์ชันที่ใช้ iterator:

test bench_search_for  ... bench:  19,620,300 ns/iter (+/- 915,700)
test bench_search_iter ... bench:  19,234,900 ns/iter (+/- 657,200)

implementation สองแบบมี performance ที่คล้ายกัน! เราจะไม่อธิบายโค้ด benchmark ที่นี่เพราะประเด็นไม่ใช่การพิสูจน์ว่าสองเวอร์ชันเทียบเท่า กัน แต่เพื่อรับความรู้สึกทั่วไปว่า implementation สองแบบนี้ เปรียบเทียบกันในเชิง performance อย่างไร

สำหรับ benchmark ที่ครอบคลุมมากขึ้น คุณควรตรวจสอบโดยใช้ text ต่าง ๆ ของขนาดต่าง ๆ เป็น contents, คำต่าง ๆ และคำที่ยาวต่าง ๆ เป็น query และความหลากหลายอื่นทุกประเภท ประเด็นคือสิ่งนี้ — iterator แม้ว่าเป็น abstraction ระดับสูง ถูกคอมไพล์ลงเป็นโค้ดประมาณเดียวกับที่ คุณเขียนโค้ดระดับต่ำกว่าด้วยตัวเอง iterator เป็นหนึ่งใน zero-cost abstraction ของ Rust ซึ่งเราหมายความว่าการใช้ abstraction ไม่ impose overhead runtime เพิ่ม นี่คล้ายกับวิธีที่ Bjarne Stroustrup ผู้ออกแบบดั้งเดิมและ implementer ของ C++ นิยาม zero-overhead ในการ นำเสนอ keynote ETAPS 2012 ของเขา “Foundations of C++”:

โดยทั่วไป implementation C++ ปฏิบัติตามหลัก zero-overhead — สิ่งที่ คุณไม่ใช้ คุณไม่จ่ายสำหรับ และเพิ่มเติม — สิ่งที่คุณใช้ คุณไม่ สามารถ hand code ได้ดีกว่า

ในหลายกรณี โค้ด Rust ที่ใช้ iterator คอมไพล์เป็น assembly เดียวกับ ที่คุณเขียนด้วยมือ Optimization เช่น loop unrolling และการ eliminate bound checking บนการเข้าถึง array ใช้และทำให้โค้ดที่ได้มีประสิทธิภาพ สุด ๆ ตอนนี้คุณรู้สิ่งนี้แล้ว คุณใช้ iterator และ closure ได้โดยไม่ กลัว! พวกมันทำให้โค้ดดูเหมือนเป็นระดับสูงแต่ไม่ impose บทลงโทษ performance runtime สำหรับการทำเช่นนั้น

สรุป

Closure และ iterator เป็นฟีเจอร์ Rust ที่ได้รับแรงบันดาลใจจากแนวคิด ภาษาโปรแกรม functional พวกมันมีส่วนต่อความสามารถของ Rust ที่จะแสดง แนวคิดระดับสูงอย่างชัดเจนที่ performance ระดับต่ำ implementation ของ closure และ iterator เป็นเช่นนั้นที่ performance runtime ไม่ถูก กระทบ นี่เป็นส่วนของเป้าหมายของ Rust ที่พยายามให้ zero-cost abstraction

ตอนนี้เราปรับปรุง expressiveness ของโปรเจกต์ I/O ของเราแล้ว มาดู ฟีเจอร์เพิ่มของ cargo ที่จะช่วยให้เราแชร์โปรเจกต์กับโลก