2010-10-28 17 views
16

150K öğeye sahip Listem var. Ortalama çalışma süresi IndexOf(), Contains() öğesinden 4 kat daha düşük. Int'in listesini kullanmaya çalıştım. IndexOf dizeleri listesi için biraz daha hızlıdır.Neden Liste <T> .IndexOf() <T> Listesinden çok daha hızlı .Contains()?

Sadece bir ana fark buldum, bu özellik TargetedPatchingOptOut. MSDN söyler:

bu özellik uygulandığı için .NET Framework sınıf kütüphanesi yöntemi servis bültenleri tarafından değişmesinin pek mümkün olduğunu gösterir ve bu nedenle Özgün Görüntü Oluşturucu (NGen) görüntüleri arasında satır içine yerleştirilmiş uygun hale gelir.

Bu özellik böyle bir davranışın nedeni olabilir mi? Ve neden Contains() yöntemi böyle bir özelliğe sahip değil?

Şimdiden teşekkürler.

DÜZENLEME:

List<int> list = CommonHelper.GetRandomList(size); 

long min = long.MaxValue; 
long max = 0; 
long sum = 0; 

foreach (var i in list) 
{ 
    m_stopwatch.Reset(); 
    m_stopwatch.Start(); 
    list.Contains(i); // list.IndexOf(i); 
    m_stopwatch.Stop(); 

    long ticks = m_stopwatch.ElapsedTicks; 

    if (ticks < min) 
     min = ticks; 

    if (ticks > max) 
     max = ticks; 

    sum += ticks; 
} 

long averageSum = sum/size; 

EDIT 2: Aynı yazdım

Böyle kod şey var IndexOf() gibi kodu ve Contains() 'dan daha yavaş çalışır.

+1

Bu durumda veriler nedir bir 150k büyüklüğünde seti ile bazı farkı dikkate olabilir "4x fark" fiili durum görünmemektedir göz önüne alındığında? –

+0

Ve hayır - özniteliğin bununla ilgili bir şey olduğunu düşünmüyorum. –

+0

Int ve string kullanıyorum, davranış aynı. –

cevap

4

Her biri, MSDN girdilerine göre eşitliği biraz daha farklı bir şekilde belirleme yöntemine ulaşır. Bu girişlerin her birinin 'açıklamalar' altına bakın:

List<T>.IndexOfEqualityComparer<T>.Default http://msdn.microsoft.com/en-us/library/e4w08k17.aspx

List<T>.Contains kullanır IEquatable<T>.Equals http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

kullanır onlar çok sonunda eşitlik belirlemek için aynı yöntemi çağırarak sona bile (burada olduğu gibi), oraya ulaşmak için farklı yollar alıyorlar, bu yüzden muhtemelen 'onu' söylüyor.

, bazı off-uzattı boks özellikle veri

+0

İlginç. Bu farkın arkasındaki mantık nedir? – Thilo

+0

Gerçekten bilmiyorum; Aslında, farklı olmaları muhtemel görünmüyordu, neredeyse eşitliği test etmek için hangi yöntemleri kullandıklarını kontrol etmedim. –

+0

IEquatable'ın daha hızlı olmasını beklemez miydin? Ayrıca x4'ün bir farkı oldukça fazla görünüyor. – Kobi

İlgili konular