A question được đăng trước đó đã cho tôi suy nghĩ. Any()
và Count()
có hoạt động tương tự khi được sử dụng trong danh sách trống không?C#: Bất kỳ() vs Count() cho một danh sách trống
Như được giải thích here, cả hai phải đi qua các bước tương tự của GetEnumerator()/MoveNext()/Dispose()
.
Tôi thử nghiệm này bằng cách sử dụng chương trình nhanh chóng trên LINQPad:
static void Main()
{
var list = new List<int>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 10000; i++)
list.Any();
stopwatch.Stop();
Console.WriteLine("Time elapsed for Any() : {0}", stopwatch.Elapsed);
stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 10000; i++)
list.Count();
stopwatch.Stop();
Console.WriteLine("Time elapsed for Count(): {0}", stopwatch.Elapsed);
}
Và kết quả chung dường như chỉ ra rằng Count()
là nhanh hơn trong tình huống này. Tại sao vậy?
Tôi không chắc liệu mình có được điểm chuẩn hay không, tôi sẽ đánh giá cao bất kỳ sự điều chỉnh nào nếu không.
Chỉnh sửa: Tôi hiểu rằng điều đó có ý nghĩa hơn về mặt ngữ nghĩa. Liên kết đầu tiên tôi đã đăng trong câu hỏi cho thấy một tình huống mà nó có ý nghĩa để sử dụng trực tiếp Count()
vì giá trị sẽ được sử dụng, do đó là câu hỏi.
Cả hai đều sẽ rất nhanh nhưng, nếu thử nghiệm một 'List' chỉ cần gõ 'tài sản Count', chứ không phải là' Count()' mở rộng, mà không yêu cầu phải liệt kê. – Jodrell
Điểm chuẩn của bạn hiển thị chính xác những gì? Tôi hy vọng rằng việc gọi một trong số này chỉ 10000 lần sẽ nhanh đến mức không thể đo lường được một cách hợp lý. –
Lý do 'Bất kỳ' là tốt hơn thường là vì nó chỉ cần tìm một thứ trong liệt kê, nhưng đếm cần phải tìm tất cả chúng. Trong thử nghiệm của bạn danh sách là trống rỗng vì vậy rõ ràng là tìm kiếm đầu tiên, và việc tìm kiếm tất cả doesnt làm cho nhiều sự khác biệt –