ReadOnlySpan<char>.IndexOf alt dizi aramasını SIMD ile nasıl yapar
Bu yazı, .NET 10 runtime'ının ReadOnlySpan<char>.IndexOf çağrısının alt dizi aramasını SIMD ile nasıl hızlandırdığını adım adım inceliyor. Yazar, elle yazılan naif döngüye karşı yaptığı BenchmarkDotNet ölçümünü ve bu farkın nedenlerini paylaşıyor. Performans odaklı çalışan her .NET geliştiricisi için değerli bir teknik okuma.
Kilit noktalar
- Karşılaştırma ordinal, yani UTF-16 karakter birimleri üzerinden yapılıyor; kültüre duyarlı değil.
- Ölçümde 65.536 karakterlik metinde geç eşleşme için naif döngü 134,935 µs, IndexOf 5,653 µs.
- Runtime yolu SpanHelpers.IndexOf içinde vektörlü aday filtresi kullanıyor; tüm eşleşmeleri tam alt dizi kontrolüyle doğruluyor.
- Sonuçlar .NET 10.0.12, AVX2 destekli bir ortamda ölçüldü; diğer sürüm ve CPU'larda farklı olabilir.
- KMP ve Boyer–Moore–Horspool karşılaştırması yazının ek bölümünde yer alıyor.
Yazar, bir metin içinde alt dizinin ilk geçtiği konumu bulan iki yöntemi karşılaştırıyor: elle yazılmış naif bir döngü ile ReadOnlySpan<char>.IndexOf çağrısı. Belirli bir makinede, 65.536 karakterlik bir metinde geç bir eşleşmede döngü, IndexOf'a göre yaklaşık 23,9 kat daha yavaş çıktı. Yazar bu sonucun her ortam için geçerli olmadığını ve iki yöntemin farklı algoritmalar kullandığını özellikle belirtiyor.
Runtime'ın yolu, UTF-16 karakterlerini 256 bitlik vektör kayıtlarında paralel işleyen bir aday filtresiyle başlıyor; ilk ve ikinci karakter konumları üzerinden olası başlangıçları eleyip kalanları tam alt dizi karşılaştırmasından geçiriyor. Yazı, bu mekanizmayı bir öğretici örnek ve assembly çıktısıyla gösteriyor. Okuyucu için pratik sonuç, sık yapılan metin aramalarında elle yazılmış döngü yerine runtime API'sini tercih etmenin genellikle daha iyi olduğu; yine de kesin kazanç için kendi verinizle ölçüm yapmanın gerektiğidir.
Gerçek dünyada kullanımı
- Büyük log dosyalarında belirli bir hata kalıbını ilk kez bulan bir ayrıştırıcı.
- Yüksek hacimli bir HTTP veya mesaj ayrıştırıcısında sabit bir başlık veya ayırıcıyı arayan kod.
- Kendi arama algoritmanızı yazmadan önce IndexOf ile karşılaştırma yapılması gereken performans testleri.
Neden önemli
Sık çalışan metin aramalarında elle yazılmış döngüler yerine ReadOnlySpan<char>.IndexOf kullanmak ciddi bir performans farkı yaratabilir. Ancak kazancın ortama ve veriye bağlı olduğunu unutmamak ve kendi girdilerinizle ölçüm yapmak gerekir.