2011-03-16 3 views
0

이가 바보 같은 질문 일 수도 있지만 ... 은 C#에서 두 코드를 재 그룹화하는 하나의 루프보다 비용이 많이 드는 두 개의 루프입니까?

내 코드를 리팩토링, 나는에 대한 답변을 찾을 수없는 질문을 함께했다 : 나는 객체 MyDumyObject 포함 된 문자열 속성이 가정

FooBar 나는 또한 MyDumyCollection

라는 MyDumyObject의 컬렉션이 가정

입니다

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
} 

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Bar = "baaaaaaaar"; 
} 

에 해당

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
    obj.Bar = "baaaaaaaar"; 
} 

?

나는 추측하고있다 : no 하지만 C#과 C# 컴파일러가 이전에 한 번 이상 작동하는 방식으로기만 당했기 때문에 지금 내 가정과 조심스럽고 확인 또는 논박.

자회사 질문 :

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 
} 

// .... 

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "foooooooooooooooooooooooo"; 
} 

에 해당

foreach(MyDumyObject obj in MyDumyCollection) 
{ 
    obj.Foo = "fooooooooo"; 

    // .... 

    obj.Foo = "foooooooooooooooooooooooo"; 
} 

입니까?

답변

10

는 두 개의 루프는별로 중요하지 루프 문 내에서 인 코드를 가정 한 루프

보다 더 많은 비용이 많이 드는 루프 오버 헤드 자체는해야보다 더 비용이 많이 드는입니다 -하지만 경우에 오버 헤드가 훨씬 더 중요해 보이므로 예 2 개의 루프가 더 많은 비용이 듭니다. 이러한 루프 각각에 대해 열거자를 생성해야하며 컬렉션의 각 항목에 대해 열거 형의 다음 항목으로 이동해야합니다 (목록의 경우 단순한 색인 액세스 [] 임에도 불구하고) - 두 개의 루프가 있으므로 오버 헤드 두번.

또한 반복 할 때 데이터가 소비되기 때문에 두 번 반복 할 수없는 열거 형이 있습니다 (예 : 네트워크에서 수신 한 데이터이지만 이러한 경우는 멀리 있습니다 - 메모리 수집의 경우 (예 : List<T>) 일반적으로 적용되지 않습니다.

일반적으로 마이크로 최적화 대 가독성을 위해 이동합니다. 루프 오버 헤드가 많은 측면에서 중요하다고 생각하지 않습니다.

+3

정말 달라집니다. 대부분의 컬렉션은 내 경험으로는 꽤 작지만 항목이 수백만 개라면 두 번 이상 반복하는 편이 낫습니다. 게다가 나는 단일 루프가 * 더 * 읽기 쉽고 덜 중요하다고 생각한다. – LukeH

+0

@LukeH : 전적으로 동의합니다 – BrokenGlass

+0

이 질문에 대한 답변은 완벽하게 고맙습니다. 나는 많은 항목 (1000 개 정도)을 가지고 있지 않으므로 큰 오버 헤드가없고 루프 안의 코드는 비용이 많이 든다. 따라서 필자의 경우에는 하나 또는 두 개의 루프가 차이를 내지 않을 것이라고 말할 것이다. 나는 가독성을 위해 해결할 것이다 :) – David

1

루프에 오버 헤드가 전혀 없는지 물어볼 수도 있습니다. 오버 헤드가 많지는 않지만 오버 헤드가있는 경우 두 개의 루프가 더 많을 것입니다.

1

자문 질문에, 그것은 줄임표에서 일어나는 일로 정말로 귀결됩니다. YourDummyCollection에있는 obj.Foo 또는 Foo의 값을 참조하는 경우, 두 루프 시나리오는 서로 다른 결과를 생성 할 수 있습니다. 예를 들어, 컬렉션 내부를 다시 반복하면서 모든 Foos의 길이를 더한 루프를 호출했습니다.마지막으로 루프를 통과하면 하나만 제외하고 모두 "foooooooooooooooooooooooo"가됩니다. 그러나 두 번째 할당을 자체 루프로 분리하면 모두 "fooooooooo"가됩니다. 전혀 다른.

관련 문제