반 검증하기 쉬운 테스트입니다. 나는 단지보기 위해 작은 테스트를했다. 다음은 코드입니다.
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();
}
다음은 foreach 섹션입니다.
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
나는 foreach 문으로의 대체 경우 - foreach는 20 밀리 초 빨랐다 - 일관 . foreach는 135-139ms이고 foreach는 113-119ms입니다. 나는 여러 번 앞뒤로 바꿨고 방금 시작된 프로세스가 아닌지 확인했습니다.
그러나 foo 및 if 문을 제거하면 for가 30ms 빨라졌습니다 (foreach는 88ms이고 for는 59ms였습니다). 둘 다 빈 껍질이었습니다. foreach가 실제로 변수를 증가시키는 변수를 전달했다고 가정합니다. 내가 추가하면
int foo = intList[i];
그러면 for는 약 30ms 느려집니다. 나는 이것이 foo를 만들고 배열에서 변수를 잡고 foo에 할당하는 것과 관련이 있다고 가정하고 있습니다. intList [i]에 액세스하면 해당 패널티가 없습니다.
솔직히 말해서 .. 나는 foreach가 모든 상황에서 약간 느려질 것으로 예상했지만 대부분의 응용 프로그램에서 중요하지는 않습니다.
편집 : 여기 Jons 제안을 사용하는 새 코드가 있습니다 (134217728은 System.OutOfMemory 예외가 발생하기 전에 가질 수있는 가장 큰 정수입니다) :
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();
}
결과는 다음과 같습니다.
데이터 생성. for 루프 계산 : 2458ms foreach 루프 계산 : 2005ms
사물의 순서를 처리하는지 확인하기 위해 주변을 바꾸면 거의 동일한 결과가 나타납니다.