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 ที่จะช่วยให้เราแชร์โปรเจกต์กับโลก