2016-04-13 20 views
0

Bir yöntemin yürütme süresinin, daha fazla denir gibi gözüktüğü çok garip bir soruna giriyorum.C# Metot çalışma süresi, daha fazla denir

Kayıtların güncellenmesi gerekip gerekmediğini kontrol eden yöntemim.

public override bool NeedsUpdate(object obj) 
{ 
    BizContact contact = obj as BizContact; 

    int id = contact.ID; 

    DataRow contactRow = dbRows.FirstOrDefault(dr =>(int)dr[keyMapping.ColumnName]) == contact.ID); 
    if (contactRow == null) 
     return false; 

    DateTime localLastModified = (DateTime)contactRow["LastModified"]; 

    return contact.LastModified > localLastModified; 

} 

dbRows toplama NeedsUpdate çağrılan ilk kez sonra artmaz boyutunda bir listesi olduğunu.

NeedsUpdate'in bir döngüde binlerce kez çağrıldığını kontrol etmek için çok sayıda kayıt var.

İlk kez çağrıldığında, çalışmanın 1 milisaniyesinin altında olması gerekir.

1000 çağrıdan sonra, yöntemin tamamlanması 64 milisaniye sürüyor.

2.000 aramadan sonra yöntemin tamamlanması için 138 milisaniye gerekiyor.

3.000 çağrıdan sonra, yöntemin tamamlanması 187 milisaniye sürüyor.

dbRows koleksiyonunun 28.000 kayıtları vardır, bu yüzden arama süresinin biraz zaman alacağını biliyorum, ancak en azından tutarlı olmasını beklerdim.

Neleri kaçırdığım hakkında bir fikrim var mı?

Bu nasıl kullanıldığını ise: Aradığınız ürün büyük listenin başında ise doğrusal arama beklediğiniz daha hızlı aslında

foreach (object obj in dataWrapper.GetObjects()) 
{ 
    // OTHER CODE 

    Stopwatch checkUpdateSW = Stopwatch.StartNew(); 
    bool needsUpdate = dataWrapper.NeedsUpdate(obj); 
    checkUpdateSW.Stop(); 

    // OTHER CODE 
} 
+3

Zamanın NeedsUpdate'de harcadığından emin misiniz? Kayıtları değiştirmek için DataContext veya EntityFramework kullanıyorsanız, daha fazla varlığı değiştirdiğinizde bilinen sorunlar vardır ve izlenen sayı tek bir bağlamda artar, düşük performans görebilirsiniz. – mellamokb

+0

Bu doğrusal ve sütunların artmasıyla artması bekleniyor, garip davranış nedir? –

+0

Kayıtlarınızın sorgularla aynı sırada mı kontrol edileceğini biliyor musunuz? DbRows'un türü nedir? Bunu bir "Sözlük" yapabilir misiniz? –

cevap

2

biri durumdur.

Olası açıklama - her aramada baştan itibaren daha fazla olan kayıtları arıyorsunuz. Temel listeyle örnekleme:

var list = Enumerable.Range(1,10000).ToList(); 

for (var i = 0; i < 10000; i++) 
{ 
    // this linear search call will be very fast first and gradually 
    // slow down toward the end 
    var r = list.FirstOrDefaut(i); 
} 
İlgili konular