Bài viết được sự cho phép của tác giả Phạm Công Sơn
Bài viết trước tôi có nêu vấn đề so sánh giữa 2 mảng mà không sử dụng vòng lặp và thay vào đó là sử dụng Linq. Và nhiều bạn cũng đã hỏi vậy tốc độ xử lý giữa dùng vòng lặp và Linq thì dùng cái nào nhanh hơn.
Thực ra vấn đề so sánh tốc độ giữa Linq và vòng lặp không còn là chủ đề mới. Các bạn có thể search trên google là ra cả đống.
Có thể thấy là có nhiều kết quả trên google cho vấn đề này.
Tuy nhiên thực sự nhiều câu trả lời cũng chưa thỏa đáng. Chính vì vậy tôi đã làm bài viết này với những kiểm chứng và chính các bạn cũng có thể tự trải nghiệm được.
Nếu như chỉ thực hiện vòng lặp một cách thuần túy. Tôi cam đoan rằng vòng lặp for
, foreach
chắc chắn là nhanh hơn Linq. Và đây là ví dụ minh chứng.
1. Kiểm nghiệm tính tổng số của một mảng
Phương thức | Kết quả tính tổng | Thời gian thực hiện (ticks) |
---|---|---|
Sử dụng vòng lặp for | ||
Sử dụng vòng lặp foreach | ||
Sử dụng lệnh Join của Linq |
Đây là code mà tôi thực hiện kiểm chứng
Rõ ràng với vòng lặp đơn thuần thì for
nhanh nhất, Linq là chậm nhất
Nhưng đấy là chúng ta mới chỉ thực hiện với một vòng lặp đơn thuần. Trong thực tế khi duyệt phần tử ta có thể phải sử dụng for
, foreach
, while
lồng nhau thì sao? Ví dụ như sắp xếp hoặc như trong bài trước của tôi là đối sánh giữa 2 phần tử của mảng thì sẽ như thế nào
Dưới đây là kiểm chứng mà tôi tìm ra những phần tử có chung ở 2 mảng rồi thực hiện tính tổng các phần tử này.
2. Kiểm nghiệm tính tổng số phần tử chung giữa 2 mảng
Phương thức | Kết quả tính tổng | Thời gian thực hiện (ticks) |
---|---|---|
Sử dụng vòng lặp for | ||
Sử dụng vòng lặp foreach | ||
Sử dụng lệnh Join của Linq |
Các bạn có thể thấy điều gì không. Thực tế nếu dùng Linq lại cho thấy tốc độ nhanh hơn rất nhiều.
Dưới đây là code tôi thực hiện kiểm chứng
Tôi cũng đã tìm tới Source code của thư viện Enumerable.cs của Microsoft để tìm hiểu nội dung hàm Join
Đù. Code nó nhiều foreach
, for
vãi cả đ* mà méo hiểu sao nó nhanh thế nhỉ. Có lẽ có vấn đề gì đó. Hoặc có một thuật toán nào đó mà mình cũng chưa tìm hiểu tới. Nhưng phần nào cũng trả lời cho mọi người thấy là dùng Linq đúng chỗ sẽ tạo hiệu quả rất đáng ngạc nhiên. Và việc tôi dùng Linq để đối sánh giữa 2 mảng cũng rất là hợp lý. Hiện tại trong code mình cũng đã chuyển dần hết sang sử dụng Linq. Tuy nhiên cũng ko phải hoàn toàn. Trường hợp cần sử dụng for
thì vẫn phải sử dụng.
Nếu bạn có ý kiến gì hay lý giải được tai sao một số trường hợp như dùng Join
lại nhanh hơn for thì hãy chia sẻ để cùng trao đổi. Chúc cuối tuần vui vẻ
Sơn 20
Bài viết gốc được đăng tải tại sonpc20.com
Có thể bạn quan tâm:
- for vs forEach vs for/in vs for/of trong javascript
- Tài liệu làm chủ Python trong vòng 4 tuần (Phần 1)
- Tôi đã tối ưu WordPress nhanh hơn 18 lần như thế nào?
Xem thêm Việc làm Developer hấp dẫn trên TopDev