문제

다음 코드 블록 간에 성능 차이가 있다고 들었습니다.

foreach (Entity e in entityList)
{
 ....
}

그리고

for (int i=0; i<entityList.Count; i++)
{
   Entity e = (Entity)entityList[i];
   ...
}

어디

List<Entity> entityList;

나는 CLR을 기대하지 않지만 내가 알 수 있는 바에 따르면 기본적으로 동일한 코드로 요약되어야 합니다.어떤 식으로든 구체적인(난 흙이 가득 차 있어도) 증거를 갖고 있는 사람이 있나요?

도움이 되었습니까?

해결책

foreach는 열거자의 인스턴스(GetEnumerator에서 반환됨)를 생성하고 해당 열거자는 foreach 루프 과정 전체에서 상태도 유지합니다.그런 다음 열거자에서 Next() 개체를 반복적으로 호출하고 반환되는 각 개체에 대해 코드를 실행합니다.

어떤 방식으로든 동일한 코드로 귀결되지 않습니다. 실제로는 자신만의 열거자를 작성하면 알 수 있습니다.

다른 팁

여기 두 루프 간의 IL 차이점을 보여주는 좋은 기사입니다.

Foreach는 기술적으로 느리지만 사용하기 쉽고 읽기 쉽습니다.성능이 중요하지 않다면 for 루프보다 foreach 루프를 선호합니다.

foreach 샘플은 대략 다음 코드에 해당합니다.

using(IEnumerator<Entity> e = entityList.GetEnumerator()) {
    while(e.MoveNext()) {
        Entity entity = e.Current;
        ...
    }
}

여기에는 일반 for 루프가 지불할 필요가 없는 두 가지 비용이 있습니다.

  1. 엔터티List.GetEnumerator()를 통해 열거자 개체를 할당하는 비용입니다.
  2. 목록의 각 요소에 대한 두 개의 가상 메서드 호출(MoveNext 및 Current) 비용입니다.

여기서 놓친 점 하나:List에는 Count 속성이 있으며 내부적으로 요소 수를 추적합니다.

IEnumerable은 그렇지 않습니다.

IEnumerable 인터페이스를 프로그래밍하고 count 확장 방법을 사용하면 요소 수를 계산하기 위해 열거됩니다.

하지만 IEnumerable에서는 인덱스로 항목을 참조할 수 없기 때문에 논란의 여지가 있습니다.

따라서 목록과 배열에 고정하려는 경우 약간의 성능 향상을 얻을 수 있습니다.

유연성을 원하면 foreach와 프로그램을 IEnumerable에 사용하세요.(linq 및/또는 수익률 반환 사용 허용)

배분 측면에서 살펴 보는 것이 좋습니다. 이 블로그 게시물.열거자가 힙에 할당되는 상황을 정확하게 보여줍니다.

내 생각엔 당신이 할 수 있는 상황 중 하나는 ~할 것 같다 열거 가능한 유형의 크기와 루프 조건이 상수인 경우 성능 향상을 얻습니다.예를 들어:

const int ArraySize = 10;
int[] values = new int[ArraySize];

//...

for (int i = 0; i 

이 경우 루프 본문의 복잡성에 따라 컴파일러는 루프를 인라인 호출로 바꿀 수 있습니다..NET 컴파일러가 이 작업을 수행하는지 전혀 알 수 없으며, 열거 가능한 유형의 크기가 동적이면 유용성이 제한됩니다.

한 가지 상황은 foreach 무작위 액세스가 목록 순회를 의미하는 연결 목록과 같은 데이터 구조를 사용하면 더 나은 성능을 발휘할 수 있습니다.사용된 열거자 foreach 아마도 한 번에 하나의 항목을 반복하여 각 액세스를 O(1)로 만들고 전체 루프를 O(n)로 만들지만 인덱서를 호출하는 것은 헤드에서 시작하여 올바른 인덱스에서 항목을 찾는 것을 의미합니다.O(n^2)에 대한 각 루프는 O(N)입니다.

Personally I don't usually worry about it and use foreach any time I need all items and don't care about the index of the item. If I'm not working with all of the items or I really need to know the index, I use for.내가 그것이 큰 관심사라고 볼 수 있었던 유일한 때는 연결된 목록과 같은 구조에 관한 것입니다.

For Loop
for loop is used to perform the opreration n times
for(int i=0;i<n;i++)
{
l=i;
}
foreach loop

int[] i={1,2,3,4,5,6}
foreach loop is used to perform each operation value/object in IEnumarable 
foreach(var k in i)
{
l=k;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top