[c#] foreach 루프 내부 또는 외부에서 변수 선언 : 어느 것이 더 빠르거나 더 낫습니까?

이 중 어느 것이 더 빠르거나 더 좋은가요?

이 하나:

List<User> list = new List<User>();
User u;

foreach (string s in l)
{
    u = new User();
    u.Name = s;
    list.Add(u);
}

또는 이거 :

List<User> list = new List<User>();

foreach (string s in l)
{
    User u = new User();
    u.Name = s;
    list.Add(u);
}

내 초보자 개발 기술은 첫 번째 것이 더 낫다고 말하지만 내 친구는 나에게 틀렸다고 말하지만 두 번째 것이 더 좋은 이유를 알 수 없습니다.

성능에 전혀 차이가 있습니까?



답변

성능면에서 두 예제는 동일한 IL로 컴파일되므로 차이가 없습니다.

두 번째는 u루프 내에서만 사용되는 경우 의도를 더 명확하게 표현하기 때문에 더 좋습니다 .


답변

어쨌든 가장 좋은 방법은 Name …을받는 생성자를 사용하는 것입니다. 그렇지 않으면 중괄호 표기법을 사용합니다.

foreach (string s in l)
{
    list.Add(new User(s));
}

또는

foreach (string s in l)
{
    list.Add(new User() { Name = s });
}

또는 더 나은 LINQ :

var list = l.Select( s => new User { Name = s});

이제 첫 번째 예제는 어떤 경우에는 눈에 띄지 않을 정도로 빠르지 만 두 번째 예제는 더 읽기 쉽기 때문에 더 좋으며 컴파일러는 foreach의 범위 밖에서 사용되지 않기 때문에 변수를 버릴 수 있습니다 (모두 생략) .


답변

선언으로 인해 코드가 실행되지 않으므로 성능 문제가 아닙니다.

두 번째는 의미하는 바이며 두 번째 방법으로 수행하면 어리석은 오류를 만들 가능성이 적으므로 그것을 사용하십시오. 항상 필요한 가장 작은 범위에서 변수를 선언하십시오.

게다가 더 좋은 방법은 Linq를 사용하는 것입니다.

List<User> users = l.Select(name => new User{ Name = name }).ToList();


답변

성능에 대한 질문이있을 때마다 측정 만하면됩니다. 테스트를 반복하고 시간을 측정하는 것입니다.

측정하지 않고 🙂 또는 생성 된 ilasm을 보지 않고 질문에 대답하려면 의미있는 반복 횟수와 코드에서 가장 비용이 많이 드는 작업에서 차이가 눈에 띄지 않을 것입니다. 몇 주문에 의한 사용자 할당 일 가능성이 있습니다 따라서 코드 명확성에 집중하고 (일반적으로해야하는 것처럼) 2로 이동합니다.

오, 늦었어요. 이런 일에 대해 걱정하지 말라고 말하려고하거나 이런 세부 사항에 얽매이지 마세요.

케이


답변

두 번째가 더 좋습니다. 당신은 각 반복에서 새로운 사용자를 갖는 것을 의미합니다.


답변

기술적으로 첫 번째 예제는 새로운 변수를 할당하기 위해 스택 프레임을 이동할 필요가 없기 때문에 몇 나노초를 절약 할 수 있지만, 이것은 컴파일러가 인식하지 못하는 CPU 시간이 너무 적습니다. 차이를 최적화하십시오.


답변

이 시나리오에서는 두 번째 버전이 더 좋습니다.

일반적으로 반복 본문 내의 값에만 액세스해야하는 경우 두 번째 버전을 선택합니다. 반면에 최종 상태가있는 경우 변수는 루프 본문을 넘어서 유지하고 선언 한 다음 첫 번째 버전을 사용합니다.