C#'ta List döngüsü: foreach, for, Index ve Span karşılaştırması
Khalid Abuhakmeh, C#'ta List<T> üzerinde dolaşmanın tüm yollarını ve bunların .NET 10 ile .NET 11 RC 1 üzerindeki performans farklarını ölçtü. foreach, for, List.ForEach, Index(), ters döngü ve Span yaklaşımları ele alınıyor. Liste değiştirirken yaşanan hatalar ve çözümleri de yer alıyor.
Kilit noktalar
- Varsayılan olarak foreach kullanın; indeks gerektiğinde for veya Enumerable.Index() tercih edin.
- Döngü içinde Remove çağırmak InvalidOperationException fırlatır; RemoveAll veya ters for ile çözün.
- Benchmark'ta for ve foreach 1.000 ve 100.000 öğede yüzde 2 içinde eşit çıktı.
- CollectionsMarshal.AsSpan yaklaşık yüzde 21-26 daha hızlı, ancak liste değişirken kullanılmamalı.
- List.ForEach içinde async lambda kullanmayın; await edilmez ve döngü işi bitirmeden döner.
- Index() 100.000 öğede yaklaşık 5,6 kat yavaş ve 104 bayt ayırır; sıcak döngülerde kaçının.
C#'ta bir listeyi dolaşmanın en yaygın yolu foreach'tir, ancak indeks gerektiğinde, öğe değiştirmek istediğinde ya da performans önemli olduğunda başka seçenekler devreye girer. Yazar; foreach, for, List.ForEach, Enumerable.Index(), ters yönde döngü, Span ve asenkron döngüleri tek tek anlatıyor. Liste döngü sırasında değiştirilirse InvalidOperationException fırlatılmasının nedeni ve RemoveAll, ters for veya ToList() ile çözümler de yazıda yer alıyor.
Benchmark sonuçlarına göre for ve foreach neredeyse aynı hızda çalışıyor. CollectionsMarshal.AsSpan yaklaşık yüzde 20 daha hızlı kalıyor, ancak liste büyürken span'ın eski diziye işaret edebileceği uyarısı önemli. List.ForEach ve Index() ise sıcak yollarda belirgin maliyet getiriyor. Tam kod örnekleri ve tablo için orijinal yazıya bakmak faydalı olacaktır.
Gerçek dünyada kullanımı
- Sipariş veya ürün listesinden koşullu öğeleri silmek; RemoveAll ile tek çağrıda filtreleme.
- Yüksek hacimli sayısal veri işleyen bir hesaplama katmanında AsSpan ile sıcak döngüyü hızlandırmak.
- Her öğe için ağ çağrısı yapan bir servis katmanında foreach içinde await ya da Parallel.ForEachAsync kullanmak.
Neden önemli
Günlük kodda foreach yeterli, ancak listeyi döngü içinde değiştirmek ve ForEach ile async lambda kullanmak gibi yaygın hatalar sessiz ya da çalışma zamanı sorunlarına yol açabilir. Performans gerçekten kritikse hangi döngünün ne maliyet getirdiğini bilmek işe yarar.
Benzer haberler
- C# interface'lerinde collection dönüş tipleri: interface, view ve snapshot farkıNick Cosentino (Dev Leader)2 gün önce
- PostSharp 2027.0'da advice parameter binding ile aspect'ler boxing olmadan çalışırMetalama / PostSharp Blog23 Eki
- NAudio 3.3.0 ile Windows'a özgü hedef çatıları (TFM) sadeleşiyorMark Heath (Sound Code)18 Eki