Một người bạn và tôi hơi bối rối trong một cuộc thảo luận lập trình ngày hôm nay. Ví dụ, chúng tôi tạo ra một vấn đề hư cấu về việc có một số List<int>
của n số nguyên ngẫu nhiên (thường là 1.000.000) và muốn tạo một hàm trả về tập hợp tất cả các số nguyên có nhiều hơn một số nguyên. Khá đơn giản. Chúng tôi đã tạo ra một câu lệnh LINQ để giải quyết vấn đề này và một thuật toán dựa trên sắp xếp đơn giản.Tại sao LINQ có thể hoạt động nhanh hơn vòng lặp bình thường?
Bây giờ, khi chúng tôi kiểm tra tốc độ mã chạy tại (sử dụng System.Diagnostics.StopWatch
), kết quả đã gây nhầm lẫn. Mã LINQ không chỉ hoạt động tốt hơn loại đơn giản, mà nó chạy nhanh hơn mộtforeach
/for
mà chỉ làm một vòng lặp trong danh sách và không có hoạt động nào bên trong (trình biên dịch được cho là khám phá và loại bỏ alltogether).
Nếu chúng tôi tạo List<int>
số ngẫu nhiên mới trong cùng một lần thực thi chương trình và chạy lại mã LINQ, hiệu suất sẽ tăng theo thứ tự độ lớn (thường là nghìn lần). Hiệu suất của các vòng trống là tất nhiên giống nhau.
Vì vậy, những gì đang diễn ra ở đây? LINQ có sử dụng song song để làm tốt hơn các vòng bình thường không? Các kết quả này thậm chí có thể như thế nào? LINQ sử dụng quicksort chạy ở n * log (n), mà mỗi định nghĩa đã chậm hơn n.
Và điều gì đang xảy ra ở bước nhảy hiệu suất trong lần chạy thứ hai?
Cả hai chúng tôi đều bối rối và hấp dẫn với những kết quả này và hy vọng một số hiểu biết rõ ràng từ cộng đồng, chỉ để thỏa mãn sự tò mò của chính chúng ta.
Vui lòng đăng một số mã. –
Có lẽ bạn có thể chia sẻ bài kiểm tra của mình? –
Đăng mã của bạn. Có thể bạn không xem xét [hoãn thực thi] (http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx). –