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
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.
Neden bir işlev çağrısı daha hızlı ola...
Neden sıralanmamış bir dizi daha hızlı...
Neden Python kodunu daha hızlı bir işl...
Neden [] liste daha hızlı()?...
Neden't varsa PyPy 6.3 kat daha h...