IT

LINQ 문이 'foreach'루프보다 빠릅니까?

lottoking 2020. 7. 30. 09:37
반응형

LINQ 문이 'foreach'루프보다 빠릅니까?


메시는 관리자를 작성 중이며 동일한 쉐이더를 사용하는 메쉬를 그룹화 한 다음 해당 쉐이더 패스에있는 것이 좋습니다.

현재 foreach루프를 사용하고 LINQ를 사용하면 성능이 향상 될지 궁금합니다.


LINQ가 더 빠른 이유는 무엇입니까? 또한 내부적으로 루프를 사용합니다.

대부분의 경우 LINQ는 오버 헤드가 발생하기 때문에 약간 느려집니다. 성능이 중요하다면 LINQ를 사용하지 않습니다. 더 읽어서 유지 보수가 쉬운 코드를 더 짧게 만들고 싶기 때문에 LINQ를 사용하십시오.


LINQ-to-Objects는 일반적으로 약간의 오버 헤드를 추가 할 것입니다. 대부분의 코드 이상의 수행을 수행하는, 그리고 일반적으로 존재하는 루프 용을 가지고, 그리고 일반적으로 거의 발견 할 수없는 것입니다 대부분의 코드 몇 가지 아직까지의 역을 참조해야 할 일, 더 많은 코드를 이해하기 위해 간단한에 의해 제공.

LINQ - 투 - SQL과 같은 다른 LINQ 공급자를 사용하면 쿼리가 서버에서 필터링 할 수 있기 때문에 평면보다 훨씬 낫지어쨌든foreach 담요를 수행하지 않았을 가능성이 높 으므로 반드시 공정 하지는 않습니다 . 비교."select * from foo"

다시 PLINQ; 처리는 병렬 경과 time-을 줄일 수 있지만 스레드 관리 등의 over-헤드로 인해 총 CPU 시간이 약간 증가합니다.


LINQ는 foreach루프보다 더 깨끗하고 이해하기 쉬운 코드를 제공하기 때문에 루프보다 사용하는 것이 좋습니다 . 그러나 LINQ는보다 느립니다 foreach. 자세한 내용은 LINQ vs FOREACH vs FOR 루프 성능 문서를 참조하십시오 .


LINQ는 현재 느리지 만 어느 시점에서 더 빨라질 수 있습니다. LINQ의 장점은 작동 방식에 신경 쓸가 기능입니다. 새로운 방법이 엄청나게 빠르다고 생각하면 Microsoft 직원은 사용자에게 알리지 않고 구현할 수 있고 훨씬 빠 사용합니다.

더 중요한 것은 LINQ가 훨씬 더 많은 것입니다. 충분한 이유가 될 것입니다.


이지 주목해야 우리한다 아마도 for루프가 빠르게보다 foreach. 따라서 원본 게시물의 경우 렌더러와 같은 중요한 구성 요소의 성능이 걱정되면 for루프를 사용하십시오 .

참조 : .NET에서 어떤 루프가 'for'또는 'foreach'로 더 빨리 실행됩니까?


다중 코어에 송신 LINQ를 사용하면 성능이 향상 될 수 있습니다. LINQ (PLINQ) (MSDN)를 참조하십시오 .


이것은 실제로 매우 복잡한 질문입니다. Linq는 사용자가 직접 구현할 경우 하나의 작업을 매우 쉽게 만듭니다 (예 : linq .Except ()). 이것은 특히 PLinq, 특히 PLinq에 의해 구현 된 존재에 적용됩니다.

일반적으로 동일한 코드의 경우 호출의 오버 헤드로 인해 linq가 느려 처리됩니다.

그러나 많은 양의 데이터를 처리하고 요소에 간단한 계산을 적용하는 경우 다음과 같은 경우 성능이 크게 향상됩니다.

  1. 배열을 사용하여 데이터를 저장합니다.
  2. for 루프를 사용하여 foreach 또는 linq와 달리 각 요소에 액세스하십시오.

    • 참고 : 벤치마킹 할 때 모두 기억하십시오. 두 개의 연속 테스트에 동일한 어레이 / 목록을 사용하면 CPU 캐시가 두 번째 테스트를 더 빠르게합니다. *


이 질문에 관심이 있었기 때문에 지금 시험을 보았습니다. Microsoft Windows 7 Ultimate를 실행하는 8GB 램이있는 2.20GHz 사용, 2200Mhz, 2 코어의 Intel (R) i3-2328M CPU에서 .NET Framework 4.5.2.

LINQ가 각 루프보다 빠를 것입니다. 내가 얻은 결과는 다음과 가변적이다.

Exists = True
Time   = 174
Exists = True
Time   = 149

일부는 콘솔 코드 에서이 코드를 복사하여 붙여넣고 테스트 할 수있는 권한 흥미로울 것입니다. 전에 정수로 동일한 테스트를 시도했습니다. LINQ도 더 빨랐습니다.

public class Program
{
    public class Employee
    {
        public int id;
        public string name;
        public string lastname;
        public DateTime dateOfBirth;

        public Employee(int id,string name,string lastname,DateTime dateOfBirth)
        {
            this.id = id;
            this.name = name;
            this.lastname = lastname;
            this.dateOfBirth = dateOfBirth;

        }
    }

    public static void Main() => StartObjTest();

    #region object test

    public static void StartObjTest()
    {
        List<Employee> items = new List<Employee>();

        for (int i = 0; i < 10000000; i++)
        {
            items.Add(new Employee(i,"name" + i,"lastname" + i,DateTime.Today));
        }

        Test3(items, items.Count-100);
        Test4(items, items.Count - 100);

        Console.Read();
    }


    public static void Test3(List<Employee> items, int idToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = false;
        foreach (var item in items)
        {
            if (item.id == idToCheck)
            {
                exists = true;
                break;
            }
        }

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    public static void Test4(List<Employee> items, int idToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = items.Exists(e => e.id == idToCheck);

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    #endregion


    #region int test
    public static void StartIntTest()
    {
        List<int> items = new List<int>();

        for (int i = 0; i < 10000000; i++)
        {
            items.Add(i);
        }

        Test1(items, -100);
        Test2(items, -100);

        Console.Read();
    }

    public static void Test1(List<int> items,int itemToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = false;
        foreach (var item in items)
        {
            if (item == itemToCheck)
            {
                exists = true;
                break;
            }
        }

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    public static void Test2(List<int> items, int itemToCheck)
    {

        Stopwatch s = new Stopwatch();
        s.Start();

        bool exists = items.Contains(itemToCheck);

        Console.WriteLine("Exists=" + exists);
        Console.WriteLine("Time=" + s.ElapsedMilliseconds);

    }

    #endregion

}

참고 URL : https://stackoverflow.com/questions/3156059/is-a-linq-statement-faster-than-a-foreach-loop

반응형