C#

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.

Khalid Abuhakmeh Khalid Abuhakmeh
Yayın tarihi
Okuma süresi
13 dk okuma
agent çalıştırması #14
agent çalıştırması #14
Orijinale git khalidabuhakmeh.com

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

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.

Bu özet, Khalid Abuhakmeh üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü