Khi sử dụng phương pháp mở rộng IEnumerable<T>
Count()
, một mảng chậm hơn ít nhất hai lần so với danh sách.Array.Count() chậm hơn nhiều so với List.Count()
Function Count()
List<int> 2,299
int[] 6,903
Sự khác biệt này đến từ đâu?
Tôi hiểu rằng cả hai đều gọi Count
tài sản của ICollection
:
Nếu loại nguồn thực hiện ICollection, thực hiện được sử dụng để có được số lượng của các nguyên tố. Nếu không, phương pháp này sẽ xác định số lượng.
Đối với danh sách, nó trả về List<T>.Count
và cho mảng, Array.Length
. Hơn nữa, Array.Length
được cho là nhanh hơn List<T>.Count
.
Benchmark:
class Program
{
public const long Iterations = (long)1e8;
static void Main()
{
var list = new List<int>(){1};
var array = new int[1];
array[0] = 1;
var results = new Dictionary<string, TimeSpan>();
results.Add("List<int>", Benchmark(list, Iterations));
results.Add("int[]", Benchmark(array, Iterations));
Console.WriteLine("Function".PadRight(30) + "Count()");
foreach (var result in results)
{
Console.WriteLine("{0}{1}", result.Key.PadRight(30), Math.Round(result.Value.TotalSeconds, 3));
}
Console.ReadLine();
}
public static TimeSpan Benchmark(IEnumerable<int> source, long iterations)
{
var countWatch = new Stopwatch();
countWatch.Start();
for (long i = 0; i < iterations; i++) source.Count();
countWatch.Stop();
return countWatch.Elapsed;
}
}
Edit:
leppie và Knaģis câu trả lời là khá tuyệt vời, nhưng tôi muốn thêm một nhận xét.
As Jon Skeet said:
Có một cách hiệu quả hai khối tương đương, chỉ là thử nghiệm cho loại giao diện thu thập khác nhau, và sử dụng bất cứ một mà nó tìm thấy đầu tiên (nếu có). Tôi không biết liệu các bài kiểm tra thực hiện .NET cho ICollection hoặc ICollection < T> đầu tiên - tôi có thể kiểm tra nó bằng cách triển khai cả hai giao diện nhưng trả về các giá trị khác nhau từ mỗi khóa, tất nhiên, . Nó không thực sự quan trọng đối với các bộ sưu tập được xử lý tốt hơn sự khác biệt hiệu suất nhỏ - chúng tôi muốn kiểm tra giao diện "có khả năng nhất" trước tiên, mà tôi tin là giao diện chung.
Loại chung có thể xảy ra nhiều nhất, nhưng nếu bạn đảo ngược hai, tức là gọi dàn diễn viên không chung trước phiên bản chung, Array.Count() trở nên nhanh hơn một chút so với List.Count() . Mặt khác, phiên bản không phải chung là chậm hơn cho Danh sách.
Điều cần biết nếu có ai muốn gọi Count()
trong vòng lặp lặp 1e8!
Function ICollection<T> Cast ICollection Cast
List 1,268 1,738
Array 5,925 1,683
1 Thú vị. Ngoài ra, với số của bạn có vẻ như bạn đang chạy 64-bit. Trong 32-bit, sự khác biệt là nhiều hơn nữa! – leppie
Có thể điều này giúp http://stackoverflow.com/questions/981254/is-the-linq-count-faster-or-slower-than-list-count-or-array-length – V4Vendetta
Thực sự * chậm hơn bốn lần * cho các bài kiểm tra của tôi! Thú vị nhất. –