LinQ performance - phương thức Any() và Count()

Trong các ứng dụng thực tế, chúng ta rất nhiều lần phải kiểm tra 1 List<T> có phần tử hay rỗng. Việc kiểm tra này thường được các lập trình viên giải quyết bằng cách sử dụng 2 extension methods của LinQ là Count() và Any(). Với các List<T> chứa ít phần tử (khoảng vài chục phần tử) thì tốc độ xử lý của 2 phương thức này không phải là vấn đề cần quan tâm. Tuy nhiên, thực tế là chúng ta phải xử lý các List<T> có vài trăm phần tử trở lên và lúc này, hiệu năng của 2 phương thức Count() và Any() cần phải xem xét và đánh giá lại để có thể tăng hiệu năng của ứng dụng.

Trong LinQ, phương thức Count() sẽ duyệt qua toàn bộ các phần tử của List<T> và trả về tổng số phần tử. Trong khi đó, phương thức Any() trả về boolean và nó sẽ trả về kết quả ngay khi gặp phần tử đầu tiên thỏa mãn điều kiện khi duyệt qua các phần tử của List<T>. Chính vì cách hoạt động này, nên khi chỉ cần kiểm tra List<T> rỗng hay có phần tử, thì phương thức Any() sẽ cho hiệu năng cao hơn so với phương thức Count().

Chúng ta sẽ kiểm chứng điều này bằng việc thực thi 1 đoạn mã lệnh để kiểm tra List<T> có rỗng hay không bằng cả 2 phương thức, đồng thời đo thời gian thực thi của 2 phương thức này.


(Đoạn code này được viết và thực thi bằng RoslynPad, 1 công cụ miễn phí giúp thực thi các đoạn mã snippet đến từ Microsoft, vì nhiều lúc có 1 đoạn snippet mà bật VS studio hay VS code lên để execute thì hơi nhọc).
 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;


public class TeduMember
{
    public int Id { get; set; }
    public string Name => $"Member-{(Id+1)}";
}

//Create a List<T>
var teduMembers = new List<TeduMember>();
        
for(var i= 0; i < 1000; i++)
{
    teduMembers.Add(new TeduMember {
        Id = i
    });
}

//Check List<T> is empty or not with Count()
var stopWatch = new Stopwatch();
stopWatch.Start();
if (teduMembers.Count > 0) {
    Console.WriteLine("Check list with Count()");
}
stopWatch.Stop();
Console.WriteLine($"Time consumed - Count(): {stopWatch.Elapsed}");


//Check List<T> is empty or not with Any()
stopWatch.Restart();
if (teduMembers.Any()) {
    Console.WriteLine("Check list with Any()");
}
stopWatch.Stop();
Console.WriteLine($"Time consumed - Any(): {stopWatch.Elapsed}");


Kết quả sau khi thực thi chương trình:

 

Kết quả rất rõ ràng, các bạn có thể tự kiểm tra bằng các đoạn mã lệnh tương tự.


Tác giả: Nguyễn Thanh Sơn

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên