Aracılığıyla paylaş


Slow Enumerable.Contains lookup

Bu makalede için Enumerable.Containsperformans içgörüleri açıklanmaktadır.

Nedeni

uzantı yöntemi kullanılırken Enumerable.Contains yöntemi, O(1) erişimi olan gibi varsa HashSet<T>.Contains, temel kapsayıcının hızlı arama mekanizmasından yararlanmaya çalışır. Kullanılamıyorsa, yöntem koleksiyonun başlangıcından başlayarak numaralandırılabilir değerini değerlendirir ve öğe bulunana veya bulunmayana kadar numaralandırılır ve bu da O(n) erişimiyle sonuçlanır.

Performans içgörü açıklaması

Enumerable.Contains Uzantı yöntemi, öğenin belirtilen koleksiyonda bulunup bulunmadiğini görmek için kullanılabilir en hızlı erişimi deneyecek ve kullanacak şekilde tasarlanmıştır. gibi HashSet<T>temel koleksiyonlar için, belirtilen öğenin O(1) erişim süresiyle koleksiyonda olup olmadığını denetlemek için kullanabilir HashSet<T>.Contains . Temel alınan koleksiyon, verim deyimi gibi List<T> IEnumerable<T> doğrudan denetimi desteklemiyorsa, koleksiyonun başlangıcından başlamalı ve istenen öğe bulunup bulunmayıncaya kadar yinelemeli ve bu da O(n) arama süresiyle sonuçlanmalıdır. Bu uyarı tetiklenirse, daha iyi bir koleksiyon kullanmak daha iyi performansa neden olabilir.

Uyarıyı araştırma

CPU Kullanımı aracında Kaynak kodunu görüntüle'ye tıklayarak çağrı ağacına ve kaynak satırı vurgulama görünümüne gidin ve bu görünümde Enumerable.Containsen fazla zaman harcandığı yeri gösterir. Bu noktadan, temel alınan numaralandırılabilir koleksiyonun oluşturulduğu yere geri dönün ve bunun yerine gibi HashSet daha uygun bir veri yapısının kullanılıp kullanılamayacağını denetleyin.

Ayrıca bkz.

Alev Grafı ile sık erişimli yolları tanımlama