Trang chủ Lập trình C# LinQ performance - phương thức Any() và Count()
Lập trình C# 06/06/2020 16,610 lượt xem

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

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.

Chia sẻ:

Bài viết liên quan

Tìm hiểu về các loại Collection trong C#
11/12/2024 Bạch Ngọc Toàn

Tìm hiểu về các loại Collection trong C#

Trong C#, collections là các cấu trúc dữ liệu được sử dụng để lưu trữ và quản lý các nhóm đối tượng. C# cung cấp nhiều loại collections khác nhau để phù hợp với các yêu cầu cụ thể của lập trình viên

Đọc thêm
Sử dụng mảng (Arrays)
11/12/2024 Bạch Ngọc Toàn

Sử dụng mảng (Arrays)

Mảng trong C# là một cấu trúc dữ liệu lưu trữ một dãy các phần tử có bộ nhớ nằm liên tiếp nhau và có kích thước cố đinh.

Đọc thêm
Lập trình hướng đối tượng
11/12/2024 Bạch Ngọc Toàn

Lập trình hướng đối tượng

Lập trình hướng đối tượng (Object Oriented Programing) hay còn gọi là OOP. Là một kỹ thuật lập trình cho phép các lập trình viên có thể ánh xạ các thực thể bên ngoài đời thực và trừu tượng hoá thành các class và object trong mã nguồn.

Đọc thêm
Vòng lặp (loop)
11/12/2024 Bạch Ngọc Toàn

Vòng lặp (loop)

Trong thực tế khi bạn cần thực thi một khối lệnh nhiều lần. Vòng lặp cho phép chúng ta thực thi một câu lệnh hoặc một khối lệnh nhiều lần.

Đọc thêm