Yarı doğrulaması kolay bir test. Sadece görmek için küçük bir test yaptım. İşte kod:
static void Main(string[] args)
{
List<int> intList = new List<int>();
for (int i = 0; i < 10000000; i++)
{
intList.Add(i);
}
DateTime timeStarted = DateTime.Now;
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
TimeSpan finished = DateTime.Now - timeStarted;
Console.WriteLine(finished.TotalMilliseconds.ToString());
Console.Read();
}
Ve işte foreach bölümü:
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
For'u foreach ile değiştirdiğimde - foreach 20 milisaniye daha hızlıydı - tutarlı bir şekilde . For 135-139ms iken foreach 113-119ms idi. Birkaç kez ileri geri hareket ettim, sadece devreye giren bir süreç olmadığından emin oldum.
Ancak, foo ve if ifadesini kaldırdığımda, for 30 ms daha hızlıydı (foreach 88 ms ve for 59 ms idi). İkisi de boş kabuklardı. Foreach'in aslında bir değişkeni geçtiğini varsayıyorum, burada for sadece bir değişkeni artırıyordu. Eklersem
int foo = intList[i];
Sonra for, yaklaşık 30 ms yavaşlar. Bunun foo oluşturup dizideki değişkeni yakalayıp foo'ya atamakla ilgisi olduğunu varsayıyorum. Yalnızca intList [i] 'ye erişirseniz, o zaman bu cezaya sahip olmazsınız.
Dürüst olmak gerekirse .. foreach'in her koşulda biraz daha yavaş olmasını bekliyordum, ancak çoğu uygulamada önemli olacak kadar değil.
edit: işte Jons önerilerini kullanan yeni kod (134217728, System.OutOfMemory istisnası atılmadan önce sahip olabileceğiniz en büyük inttir):
static void Main(string[] args)
{
List<int> intList = new List<int>();
Console.WriteLine("Generating data.");
for (int i = 0; i < 134217728 ; i++)
{
intList.Add(i);
}
Console.Write("Calculating for loop:\t\t");
Stopwatch time = new Stopwatch();
time.Start();
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Write("Calculating foreach loop:\t");
time.Reset();
time.Start();
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Read();
}
Ve işte sonuçlar:
Veri üretiliyor. Döngü için hesaplama: 2458ms foreach döngü hesaplama: 2005ms
Her şeyin sırasını ele alıp almadığını görmek için onları değiştirmek aynı sonuçları verir (neredeyse).