SORU
29 Aralık 2011, PERŞEMBE


Neden SERİ .(Yüklem).() İlk olarak daha hızlı .İlk(yüklem)?

Bazı performans testleri yapıyorum ve SERİ bir ifade gibi olduğunu fark ettim

result = list.First(f => f.Id == i).Property

daha yavaş

result = list.Where(f => f.Id == i).First().Property

Bu karşı sezgisel görünüyor. Biliyordum bunu ilk ifade olurdu daha hızlı çünkü durduramaz üzerinden yineleme listesi olarak yüklem memnun, oysa biliyordum ki .Where() ifadesi olabilir üzerinde yineleme bütün listeyi çağırmadan önce .First() elde edilen alt kümesi. İkinci eğer kısa devre yaparsa bile doğrudan İlk kullanmaya göre daha hızlı olabilirdi, ama öyle değil.

Aşağıda bunu kanıtlayan çok basit iki birim testleri. TestWhereAndFirst üzerinde optimizasyon ile derlenmiş ilgili TestFirstOnly 0 daha hızlı .Net ve Silverlight 4. Yüklem daha fazla sonuç geri dönüş yaparak denedim ama performans farkı aynıdır.

Herhangi bir .First(fn) .Where(fn).First() daha yavaş olduğunu açıklayabilir mi? .Count(fn) benzer sayaç sezgisel bir sonuç 10 ** kıyasla görüyorum.

private const int Range = 50000;

private class Simple
{
   public int Id { get; set; }
   public int Value { get; set; }
}

[TestMethod()]
public void TestFirstOnly()
{
   List<Simple> list = new List<Simple>(Range);
   for (int i = Range - 1; i >= 0; --i)
   {
      list.Add(new Simple { Id = i, Value = 10 });
   }

   int result = 0;
   for (int i = 0; i < Range;   i)
   {
      result  = list.First(f => f.Id == i).Value;
   }

   Assert.IsTrue(result > 0);
}

[TestMethod()]
public void TestWhereAndFirst()
{
   List<Simple> list = new List<Simple>(Range);
   for (int i = Range - 1; i >= 0; --i)
   {
      list.Add(new Simple { Id = i, Value = 10 });
   }

   int result = 0;
   for (int i = 0; i < Range;   i)
   {
      result  = list.Where(f => f.Id == i).First().Value;
   }

   Assert.IsTrue(result > 0);
}

CEVAP
29 Aralık 2011, PERŞEMBE


Bende aynı sonuçları: ilk önce daha hızlı.

Jon belirtildiği gibi, Seri performans (ve) her iki yöntemde de büyük oranda benzer olması çok tembel değerlendirme kullanır.

Reflektör bakarak, İlk topluluk içinde yineleme için ama kullanımına farklı toplama türleri (dizi, vb.) listeler için özel bir çeşitlilik vardır basit bir foreach döngüsü kullanır. Muhtemelen bu küçük avantajı Nerede veriyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • beautyexchange

    beautyexchan

    4 EYLÜL 2006
  • Fuse

    Fuse

    21 Kasım 2005
  • jesiel santos

    jesiel santo

    15 Ocak 2009