Neden SERİ .(Yüklem).() İlk olarak daha hızlı .İlk(yüklem)? | Netgez.com
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

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • LatinNinja99

    LatinNinja99

    28 EKÄ°M 2011