source

.NET에서 'for'와 'for ach' 중 어떤 루프가 더 빨리 실행됩니까?

manycodes 2023. 5. 16. 22:46
반응형

.NET에서 'for'와 'for ach' 중 어떤 루프가 더 빨리 실행됩니까?

C#/VB입니다.가 더 빨리 되는지, NET/.NET, 어느 루프가 더 빨리 실행되는지,for또는foreach?

부터.for는 루프보더빨작다니동합리다보다 더 합니다.foreach오래 전에 루프는 모든 컬렉션, 일반 컬렉션, 모든 어레이 등에 대해 참이라고 가정했습니다.

구글을 검색해보니 기사가 몇 개 나왔는데, 대부분 결론이 나지 않고(기사 댓글 읽기) 오픈엔드입니다.

이상적인 것은 각 시나리오를 나열하고 동일한 시나리오에 대한 최상의 솔루션을 제공하는 것입니다.

예를 들어, 다음과 같이 설명합니다.

  1. - 1000개 이상의 문자열 -for 더 좋습니다.foreach
  2. 을 하기 위한IList- (으)로 표시됨 -foreach 더 좋습니다.for

동일한 것에 대한 몇 가지 참조가 웹에서 발견되었습니다.

  1. 엠마누엘 샨저의 원본 오래된 기사
  2. 코드 프로젝트 FORACH 대 FOR
  3. 블로그 - 수신인foreach안 그러면 안 됩니다.foreach이 입니다.
  4. 포럼 - 1 C# ASP.NET 표준 - NET 1.1 C#forforeach

[편집]

가독성 외에도 사실과 수치에 관심이 많습니다.성능 최적화의 마지막 마일이 중요한 애플리케이션도 있습니다.

Patrick Smacchia는 지난 달에 다음과 같은 결론으로 이에 대해 블로그에 올렸습니다.

  • 목록에 있는 루프의 경우 목록에 있는 각 루프보다 2배 이상 저렴합니다.
  • 어레이에서 루프하는 것이 목록에서 루프하는 것보다 약 2배 저렴합니다.
  • 따라서 for를 사용하여 어레이를 루프하는 것이 각각을 사용하여 List를 루프하는 것보다 5배 더 저렴합니다(이것이 우리 모두가 하는 일이라고 생각합니다).

먼저, 드미트리의 (현재 삭제된) 답변에 대한 반론.어레이의 경우 C# 컴파일러는 주로 다음과 같은 코드를 내보냅니다.foreach에 하는 것과 for루프. 이 벤치마크의 결과가 기본적으로 동일한 이유를 설명합니다.

using System;
using System.Diagnostics;
using System.Linq;

class Test
{
    const int Size = 1000000;
    const int Iterations = 10000;

    static void Main()
    {
        double[] data = new double[Size];
        Random rng = new Random();
        for (int i=0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }

        double correctSum = data.Sum();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j=0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop: {0}", sw.ElapsedMilliseconds);
    }
}

결과:

For loop: 16638
Foreach loop: 16529

Greg의 - 을 다으로음, 컬의유중는다요 Greg적대 - 로을열a변다니로 변경합니다.List<double>위에서, 그리고 당신은 근본적으로 다른 결과를 얻습니다.일반적으로 상당히 느릴 뿐만 아니라, 인덱스로 액세스하는 것보다 각각 상당히 느려집니다.그렇긴 하지만, 저는 여전히 코드를 단순하게 만드는 for 루프보다 각 루프를 거의 항상 선호할 것입니다. 왜냐하면 가독성은 거의 항상 중요하지만 마이크로 최적화는 거의 중요하지 않기 때문입니다.

foreach 루프는 루프보다 더 구체적인 의도를 보여줍니다.

사용foreach루프는 코드를 사용하는 모든 사용자에게 컬렉션의 위치에 관계없이 컬렉션의 각 멤버에게 작업을 수행할 계획임을 보여줍니다.또한 원본 컬렉션을 수정하지 않고 있으며, 수정하려는 경우 예외가 발생합니다.

의 다른 foreach그것은 어떤 것에도 효과가 있다는 것입니다.IEnumerable서 , 면에반.for에 대해서만 이해가 됩니다.IList각 요소가 실제로 인덱스를 가지고 있는 경우.

그러나 요소의 인덱스를 사용해야 하는 경우 당연히 다음을 사용할 수 있어야 합니다.for루프. 하지만 인덱스를 사용할 필요가 없다면 인덱스를 갖는 것은 코드를 혼란스럽게 하는 것입니다.

제가 알기로는 성능에 큰 영향은 없습니다.미래의 어느 단계에서 코드를 적용하는 것이 더 쉬울 수 있습니다.foreach여러 코어에서 실행되지만 지금은 걱정할 필요가 없습니다.

성능에 대한 논쟁이 있을 때마다 정량적 결과를 사용하여 사례를 뒷받침할 수 있도록 작은 테스트를 작성하기만 하면 됩니다.

StopWatch 클래스를 사용하고 정확성을 위해 몇 백만 번 반복합니다.(for 루프가 없으면 어려울 수 있습니다.)

using System.Diagnostics;
//...
Stopwatch sw = new Stopwatch()
sw.Start()
for(int i = 0; i < 1000000;i ++)
{
    //do whatever it is you need to time
}
sw.Stop();
//print out sw.ElapsedMilliseconds

이 결과에 따르면 차이는 무시할 수 있으며 가장 유지 관리 가능한 코드의 결과를 수행하는 것이 좋습니다.

항상 가까울 것입니다.배열의 경우, 때때로 for더 하지만, 조더빠만지르금,만▁is,foreach표현력이 뛰어나며 LINQ 등을 제공합니다.일반적으로 다음을 고수합니다.foreach.

또한.foreach일부 시나리오에서는 최적화될 수 있습니다.예를 들어 인덱서에서 링크된 목록이 잘못되었을 수 있지만 링크된 목록은 다음과 같이 빠르게 이동할 수 있습니다.foreach인 사기, 그은준.LinkedList<T>이러한 이유로 인덱서도 제공하지 않습니다.

제 생각에는 99%의 경우에는 중요하지 않을 것 같은데, 왜 가장 적합한 것(가장 이해하기 쉬운 것/유지관리) 대신 빠른 것을 선택하십니까?

좋은 이유가 있습니다. foreach 루프한 위의 루프for 프를 할 수 . 만약 당신이 사용할 수 있다면.foreach루프, 당신이 그래야 한다는 당신의 상사의 말이 맞습니다.

그러나 모든 반복이 단순히 목록을 하나씩 차례로 통과하는 것은 아닙니다.만약 그가 금지하고 있다면, 그것은 잘못된 것입니다.

내가 당신이라면, 제가 할 일은 루프에 대한 당신의 모든 자연을 재귀로 바꾸는 것입니다.그것은 그에게 교훈을 줄 것이고, 또한 당신에게 좋은 정신 운동입니다.

둘 사이에 큰 성과 차이는 없을 것 같습니다.항상 그렇듯이, "어느 것이 더 빠릅니까?"라는 질문에 직면할 때, 여러분은 항상 "나는 이것을 측정할 수 있습니다."라고 생각해야 합니다.

루프 본체에서 동일한 작업을 수행하는 루프를 두 개 작성하고, 둘 다 실행하고 시간을 지정하여 속도의 차이가 무엇인지 확인합니다.거의 비어있는 몸과 여러분이 실제로 할 것과 유사한 루프 몸 둘 다를 사용하여 이 작업을 수행합니다.또한 사용 중인 컬렉션 유형과 함께 사용해 보십시오. 컬렉션 유형에 따라 성능 특성이 다를 수 있습니다.

2005년 TechEd에서 제프리 리히터:

"저는 수년간 C# 컴파일러가 기본적으로 제게 거짓말쟁이라는 것을 배웠습니다.""그것은 많은 것들에 대해 거짓말을 합니다." ... "예를 들어, 각 루프에 대해 한 줄씩 작성할 때..." ... ...그것은 당신이 작성하는 작은 코드이지만, C# 컴파일러가 그렇게 하기 위해 뱉는 것은 놀라운 일입니다.그것은 그 안에서 시도/마지막으로 블록을 만들고, 마지막 블록 안에서 그것은 당신의 변수를 ID 일회용 인터페이스에 캐스팅합니다. 그리고 만약 캐스팅이 성공한다면, 그것은 그것에 대한 Dispose 메서드를 호출하고, 루프 안에서 Current 속성과 MoveNext 메서드를 반복적으로 호출합니다. 커버 아래에 객체가 생성됩니다.많은 사람들이 매우 쉬운 코딩, 매우 쉬운 작업이기 때문에 각 작업에 사용합니다." ... "각 괄호 표기법을 사용하는 대신 인덱스만 사용하여 컬렉션을 반복하면 작업 속도가 훨씬 빨라지고 힙에 개체가 생성되지 않습니다.."

온디맨드 웹캐스트: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032292286&EventCategory=3&culture=en-US&CountryCode=US

당신은 딥에서 그것에 대해 읽을 수 있습니다.NET - 파트 1 반복

(첫 번째 초기화 없이) 의 결과를 포함합니다.분해까지 NET 소스 코드입니다.

예: 각 루프에 대한 배열 반복:

및 - 각 루프에 대한 반복을 나열합니다.

그리고 최종 결과:

여기에 이미지 설명 입력

당신이 물건들의 컬렉션을 가지고 작업하는 경우,foreach 더낫만지, 만당숫늘린를면다자이신약,▁is▁a,.for루프가 더 좋습니다.

마지막 경우 다음과 같은 작업을 수행할 수 있습니다.

foreach (int i in Enumerable.Range(1, 10))...

것은 , 는 더 나쁜 했을 때 더 나쁜 성능을 가지고 . 실제로 성능이 더 좋지 않습니다.for.

이렇게 하면 절약할 수 있습니다.

public IEnumerator<int> For(int start, int end, int step) {
    int n = start;
    while (n <= end) {
        yield n;
        n += step;
    }
}

사용:

foreach (int n in For(1, 200, 4)) {
    Console.WriteLine(n);
}

더 큰 승리를 위해 세 명의 딜러를 매개 변수로 사용할 수 있습니다.

서의속 for a 리고a.foreach할 때 .LINQ컬렉션에 대한 쿼리는 쓰는 것이 더 좋지만 거의 항상 약간 느립니다!다른 포스터들이 말했듯이, 1밀리초의 추가적인 성능보다는 표현력을 추구하세요.

지금까지 언급되지 않은 것은 다음과 같은 경우입니다.foreach루프는 컴파일되고, 반복되는 컬렉션을 기반으로 컴파일러에 의해 최적화됩니다.즉, 어떤 루프를 사용할지 확신할 수 없을 때는foreach루프 - 컴파일될 때 최적의 루프를 생성합니다.더 읽기 쉽습니다.

의 또 주요 은 다음과 .foreach변경될 (int는션))입니다.arrayList<int>를 들어) 그런 당신의 예를들당신의면그러어▁your▁for.foreach루프는 코드를 변경할 필요가 없습니다.

foreach (int i in myCollection)

, 여러분의 에서, 의내용은당유동어일반컬는면서당에, 렉션의신한든이형떤위.for루프, 변경한 경우 다음은 빌드되지 않습니다.myCollectionarrayList:

for (int i = 0; i < myCollection.Length, i++)

이 질문에는 대부분의 "어느 것이 더 빠릅니까?" 질문과 같은 두 가지 대답이 있습니다.

측정하지 않으면 알 수 없습니다.

(왜냐하면...) 상황에 따라 다릅니다.

반복할 IE 숫자 유형에 대해 "이 [int 인덱스]" 방법이 얼마나 비싼지에 따라 "MoveNext()" 방법이 달라집니다.

"foreach" 키워드는 일련의 작업의 줄임말입니다. IE 번호 테이블에서 GetEnumerator()를 한 번 호출하고 반복당 MoveNext()를 한 번 호출하며 일부 유형 검사를 수행합니다.성능 측정에 가장 영향을 미칠 가능성이 높은 것은 MoveNext()가 O(N)번 호출되기 때문에 발생하는 비용입니다.저렴할 수도 있지만 그렇지 않을 수도 있습니다.

"for" 키워드는 더 예측 가능해 보이지만 대부분의 "for" 루프 안에는 "collection[index]"와 같은 것이 있습니다.이는 단순한 배열 인덱싱 작업처럼 보이지만 실제로는 메소드 호출이며, 메소드 호출의 비용은 반복되는 컬렉션의 특성에 전적으로 의존합니다.아마 그것은 싸지만, 그렇지 않을 수도 있습니다.

컬렉션의 기본 구조가 본질적으로 연결된 목록인 경우 MoveNext는 훨씬 저렴하지만 인덱서는 O(N) 비용이 발생하여 "for" 루프 O(N*N)의 실제 비용이 될 수 있습니다.

"그에게 포루프가 사용 가능하다고 설득하는 데 도움이 될 만한 주장이 있습니까?"

아니요, 만약 당신의 상사가 당신에게 어떤 프로그래밍 언어가 사용되어야 하는지를 알려줄 정도로 미세하게 관리하고 있다면, 당신은 정말로 말할 수 있는 것이 없습니다.미안하다.

모든 언어 구조는 적절한 시간과 장소를 사용합니다.C# 언어에 4개의 개별 반복 문이 있는 데는 이유가 있습니다. 각각은 특정 목적을 위해 존재하고 적절한 용도를 가지고 있습니다.

하는 것을 합니다.for루프에는 목적이 있습니다.끔은가가 나올 .for은 반복블록알보고더다설명명다보다 을 더 합니다.foreach .이것이 사실이라면, 그것들을 사용하는 것이 적절합니다.

저는 또한 당신의 상사에게 지적하고 싶습니다 - 성능은 어떤 실질적인 방법으로도 문제가 되지 않으며, 그것은 알고리즘을 간결하고 의미 있고 유지 가능한 방식으로 표현하는 것의 문제입니다.이와 같은 미세 최적화는 실제 성능 이점이 루프 구조조정이 아닌 알고리즘 재설계 및 리팩터링에서 발생하기 때문에 성능 최적화의 시점을 완전히 놓칩니다.

합리적인 논의 후에도 여전히 이러한 권위주의적 견해가 있다면 어떻게 진행할지는 당신에게 달려 있습니다.개인적으로, 저는 이성적인 생각이 위축된 환경에서 일하는 것이 행복하지 않을 것이고, 다른 고용주 밑에서 다른 직장으로 옮기는 것을 고려할 것입니다.하지만, 저는 화를 내기 전에 토론을 하는 것을 강력히 추천합니다 - 단지 단순한 오해가 있을 수 있습니다.

열거하는 컬렉션 유형과 인덱서 구현에 따라 다를 수 있습니다.으로 그나일으로적을 사용하면 용사.foreach더 나은 접근법이 될 것 같습니다.

또한, 어떤 제품과도 작동합니다.IEnumerable인덱서만 있는 것이 아닙니다.

여부for보다 .foreach정말 요점을 벗어났습니다.저는 어떤 것을 선택하는 것이 당신의 성과에 중대한 영향을 미칠지 심각하게 의심스럽습니다.

응용프로그램을 최적화하는 가장 좋은 방법은 실제 코드를 프로파일링하는 것입니다.이를 통해 가장 많은 작업/시간을 차지하는 방법을 정확히 파악할 수 있습니다.먼저 최적화합니다.성능이 여전히 허용되지 않으면 이 절차를 반복합니다.

일반적으로 미시적 최적화는 중요한 이점을 거의 제공하지 않기 때문에 멀리하는 것이 좋습니다.유일한 예외는 식별된 핫 경로를 최적화하는 경우입니다. 즉, 프로파일링에서 매우 많이 사용되는 몇 가지 방법을 식별하는 경우 이러한 방법을 광범위하게 최적화하는 것이 타당할 수 있습니다.

루프 내부에서 수행하는 작업이 성능에 영향을 미치는 것이지 실제 루프 구성이 아닙니다(이 경우는 중요하지 않다고 가정).

두 개는 거의 정확히 같은 방식으로 달릴 것입니다.둘 다 사용할 코드를 작성한 다음 IL을 보여줍니다.성능에 차이가 없음을 의미하는 유사한 계산을 보여주어야 합니다.

대부분의 경우에는 차이가 없습니다.

일반적으로 명시적인 숫자 인덱스가 없을 때는 항상 각각을 사용해야 하며 실제로 반복 가능한 컬렉션이 없을 때는 항상 사용해야 합니다(예: 위쪽 삼각형의 2차원 배열 그리드에서 반복).선택의 여지가 있는 경우도 있습니다.

코드에 마법의 숫자가 나타나기 시작하면 루프를 유지하는 것이 조금 더 어려울 수 있다고 주장할 수 있습니다.루프가 금지되었다는 이유만으로 for 루프를 사용할 수 없고 컬렉션을 빌드하거나 람다를 사용하여 하위 컬렉션을 빌드해야 하는 것에 대해 짜증을 내는 것이 옳아야 합니다.

for 루프와 같은 것의 사용을 완전히 금지하는 것은 좀 이상해 보입니다.

여기 두 루프의 성능 차이를 많이 다루는 흥미로운 기사가 있습니다.

저는 개인적으로 루프에 대해 조금 더 읽을 수 있다고 생각하지만, for 루프가 더 적절하다면 각 루프에 대해 추가로 긴 코드를 작성할 필요가 없고 현재 작업에 가장 적합한 것을 사용자는 각 루프에 대해 추가로 긴 코드를 작성할 필요가 없습니다.

당신은 정말로 그의 머리를 비틀고 각 마감에 대해 IQueryable을 대신할 수 있습니다.

myList.ForEach(c => Console.WriteLine(c.ToString());

구현할 수 있는 단순한 논리를 가지고 있기 때문에 각 논리보다 빠릅니다.

특정 속도 최적화 프로세스를 수행하지 않는 한 코드를 가장 쉽게 읽고 유지 관리할 수 있는 방법을 사용하십시오.

수집 클래스 중 하나와 같이 반복기가 이미 설정되어 있는 경우에는 각각의 반복기를 사용하는 것이 좋습니다.그리고 만약 그것이 반복하는 정수 범위라면, 아마도 더 깨끗할 것입니다.

Jeffrey Richter는 최근 팟캐스트 http://pixel8.infragistics.com/shows/everything.aspx#Episode:9317 에서 각 팟캐스트의 성능 차이에 대해 이야기했습니다.

얼마 전에 테스트를 했는데, 그 결과는for는 프는보훨빠릅다니씬다보다 .foreach 원인은 간단합니다.foreach는 먼저 루프먼인해야합니다화스스를 .IEnumerator소장용의

나는 찾았습니다.foreach 를통반는루프되복해를 List 빨리. 아래 내 테스트 결과를 참조하십시오.아래 코드에서 다음을 반복합니다.array100, 10000 및 100000 크기의 별도 사용for그리고.foreach시간을 측정하기 위한 루프.

여기에 이미지 설명 입력

private static void MeasureTime()
    {
        var array = new int[10000];
        var list = array.ToList();
        Console.WriteLine("Array size: {0}", array.Length);

        Console.WriteLine("Array For loop ......");
        var stopWatch = Stopwatch.StartNew();
        for (int i = 0; i < array.Length; i++)
        {
            Thread.Sleep(1);
        }
        stopWatch.Stop();
        Console.WriteLine("Time take to run the for loop is {0} millisecond", stopWatch.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("Array Foreach loop ......");
        var stopWatch1 = Stopwatch.StartNew();
        foreach (var item in array)
        {
            Thread.Sleep(1);
        }
        stopWatch1.Stop();
        Console.WriteLine("Time take to run the foreach loop is {0} millisecond", stopWatch1.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("List For loop ......");
        var stopWatch2 = Stopwatch.StartNew();
        for (int i = 0; i < list.Count; i++)
        {
            Thread.Sleep(1);
        }
        stopWatch2.Stop();
        Console.WriteLine("Time take to run the for loop is {0} millisecond", stopWatch2.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("List Foreach loop ......");
        var stopWatch3 = Stopwatch.StartNew();
        foreach (var item in list)
        {
            Thread.Sleep(1);
        }
        stopWatch3.Stop();
        Console.WriteLine("Time take to run the foreach loop is {0} millisecond", stopWatch3.ElapsedMilliseconds);
    }

업데이트됨

@jgauffin 제안 후에 나는 @johnskeet 코드를 사용했고 그것을 발견했습니다.for.array.

  • 배열이 있는 각 루프에 대해.
  • 목록이 있는 루프의 경우.
  • 목록이 있는 각 루프에 대해.

아래의 테스트 결과 및 코드를 참조하십시오.

여기에 이미지 설명 입력

private static void MeasureNewTime()
    {
        var data = new double[Size];
        var rng = new Random();
        for (int i = 0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }
        Console.WriteLine("Lenght of array: {0}", data.Length);
        Console.WriteLine("No. of iteration: {0}", Iterations);
        Console.WriteLine(" ");
        double correctSum = data.Sum();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j = 0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop with Array: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (var i = 0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop with Array: {0}", sw.ElapsedMilliseconds);
        Console.WriteLine(" ");

        var dataList = data.ToList();
        sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j = 0; j < dataList.Count; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop with List: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in dataList)
            {
                sum += d;
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop with List: {0}", sw.ElapsedMilliseconds);
    }

BenchmarkDotNet 라이브러리를 사용하면 시간을 정확하게 측정할 수 있습니다.

에서는 1,했습니다.for/foreachBenchmarkDotNet으로 측정했습니다.

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public class Program
{
    public static void Main()
    {
        BenchmarkRunner.Run<LoopsBenchmarks>();
    }
}

[MemoryDiagnoser]
public class LoopsBenchmarks
{
    private List<int> arr = Enumerable.Range(1, 1_000_000_000).ToList();

    [Benchmark]
    public void For()
    {
        for (int i = 0; i < arr.Count; i++)
        {
            int item = arr[i];
        }
    }

    [Benchmark]
    public void Foreach()
    {
        foreach (int item in arr)
        {
        }
    }
}

결과는 다음과 같습니다.

여기에 이미지 설명 입력

결론

위의 예에서 우리는 다음을 볼 수 있습니다.for는 루가보다약빠릅다니보다 약간 .foreach루프에서 목록을 찾습니다.또한 두 가지 모두 동일한 메모리 할당을 사용한다는 것을 알 수 있습니다.

저는 그 누구도 그 둘 사이에 "엄청난" 성과 차이를 발견할 것이라고 기대하지 않을 것입니다.

액세스하려는 컬렉션에 더 빠른 인덱서 액세스 구현이 있는지 또는 더 빠른 IEumerator 액세스 구현이 있는지에 따라 답이 달라집니다.IEumerator는 인덱서를 자주 사용하고 현재 인덱스 위치의 복사본만 보유하기 때문에 열거자 액세스가 직접 인덱스 액세스보다 적어도 느리거나 느릴 것으로 예상하지만 많이는 아닙니다.

물론 이 답변은 컴파일러가 구현할 수 있는 최적화를 설명하지 않습니다.

언급URL : https://stackoverflow.com/questions/365615/in-net-which-loop-runs-faster-for-or-foreach

반응형