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

So sánh Hiệu suất: Vòng lặp và Iterator

Để quyết định nên sử dụng vòng lặp hay iterator, bạn cần biết triển khai nào nhanh hơn: phiên bản của hàm search với vòng lặp for rõ ràng hay phiên bản với iterator.

Chúng tôi đã chạy một bài kiểm tra hiệu suất bằng cách tải toàn bộ nội dung của The Adventures of Sherlock Holmes của Sir Arthur Conan Doyle vào một String và tìm kiếm từ the trong nội dung. Dưới đây là kết quả kiểm tra hiệu suất trên phiên bản search sử dụng vòng lặp for và phiên bản sử dụng 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)

Hai triển khai có hiệu suất tương tự! Chúng tôi sẽ không giải thích mã kiểm tra hiệu suất ở đây vì điểm quan trọng không phải để chứng minh rằng hai phiên bản là tương đương mà để có cảm nhận chung về cách hai triển khai này so sánh về mặt hiệu suất.

Để có một bài kiểm tra hiệu suất toàn diện hơn, bạn nên kiểm tra sử dụng các văn bản khác nhau với kích thước khác nhau làm contents, các từ khác nhau và các từ có độ dài khác nhau làm query, và tất cả các biến thể khác. Điểm quan trọng là: iterator, mặc dù là một trừu tượng cấp cao, được biên dịch thành mã gần giống như khi bạn tự viết mã cấp thấp. Iterator là một trong những trừu tượng không tốn chi phí của Rust, nghĩa là việc sử dụng trừu tượng không áp đặt thêm chi phí thời gian chạy. Điều này tương tự như cách Bjarne Stroustrup, nhà thiết kế và người triển khai ban đầu của C++, định nghĩa không tốn chi phí trong "Foundations of C++" (2012):

Nói chung, các triển khai C++ tuân theo nguyên tắc không tốn chi phí: Những gì bạn không sử dụng, bạn không phải trả giá. Và hơn nữa: Những gì bạn sử dụng, bạn không thể tự viết mã tốt hơn được.

Trong nhiều trường hợp, mã Rust sử dụng iterator được biên dịch thành cùng assembly mà bạn sẽ viết bằng tay. Các tối ưu hóa như mở rộng vòng lặp và loại bỏ kiểm tra giới hạn trên truy cập mảng được áp dụng và làm cho mã kết quả cực kỳ hiệu quả. Bây giờ bạn đã biết điều này, bạn có thể sử dụng iterator và closure mà không sợ hãi! Chúng làm cho mã có vẻ như ở cấp độ cao hơn nhưng không áp đặt hình phạt hiệu suất thời gian chạy khi làm như vậy.

Tóm tắt

Closure và iterator là các tính năng của Rust lấy cảm hứng từ ý tưởng ngôn ngữ lập trình hàm. Chúng đóng góp vào khả năng của Rust trong việc biểu đạt rõ ràng các ý tưởng cấp cao với hiệu suất cấp thấp. Các triển khai của closure và iterator là như vậy để hiệu suất thời gian chạy không bị ảnh hưởng. Đây là một phần trong mục tiêu của Rust nhằm cung cấp các trừu tượng không tốn chi phí.

Bây giờ chúng ta đã cải thiện khả năng biểu đạt của dự án I/O của mình, hãy xem xét một số tính năng khác của cargo sẽ giúp chúng ta chia sẻ dự án với thế giới.