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가 느려 처리됩니다.
그러나 많은 양의 데이터를 처리하고 요소에 간단한 계산을 적용하는 경우 다음과 같은 경우 성능이 크게 향상됩니다.
- 배열을 사용하여 데이터를 저장합니다.
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
'IT' 카테고리의 다른 글
Eclipse에서 Tomcat 서버의 시간 초과 변경 (0) | 2020.07.30 |
---|---|
WPF 수준을 이산 정수 위치에만 맞추는 방법은 무엇입니까? (0) | 2020.07.30 |
루비-배열이 아닌 경우 변수를 배열로 우아하게 변환 (0) | 2020.07.30 |
Mac OS X에 내장 vim 업데이트 (0) | 2020.07.30 |
Eclipse에서 CSS 사전 처리를 통합하는 방법은 무엇입니까? (0) | 2020.07.30 |