[C# 문법] Linq 성능 개선
- C#/C# 문법
- 2022. 6. 10. 16:11
참고
개요
- DotNetTips| COLLECTION PERFORMANCE: HOW DO YOU LINQ? 위 사이트에서 다루고 있는 내용을 번역하여 작성한 글입니다.
- C# 으로 프로그래밍을 하다 보면, Linq 사용은 필수 인데요. 어떻게 하면 보다 더 괜찮은 방법으로 Linq 를 사용하는지에 대한 Tip 이 있기 때문에 공부 할 겸 번역하여 글을 올렸습니다.
The LINQ API(query) & LAMBDA
- LINQ 사용 초기에는 아래 방법이 where 쿼리를 사용하는 가장 보편적인 방법입니다.
var query = from person in PersonCollection
where person.Age.TotalDays > 1000
select person;
var result = qeury.ToList(); // 여기서 query를 동작 시킵니다.
- 위 쿼리를 LAMBDA를 이용해 작성합니다.
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).ToList();
- 두 방법 중 어느 것이 빠르다고 생각하나요?
- 두 방법 모두 처리 성능은 거의 비슷해 별다른 차이를 보이지 않습니다.
ANY()
- Any() 메소드는 조건과 일치하는 아이템이 하나라도 있는지 확인하여 boolean 값으로 결과를 반환합니다.
- Any()를 사용하는 3가지 방법이 있습니다.
var query = from person in PersonCollection
where person.Age.TotalDays > 1000
select person;
var result = query.Any();
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).Any();
var result = PersonCollection.Any(p => p.Age.TotalDays > 1000);
성능
- 보는 바와 같이 Any()만 단독으로 사용하는 LAMBDA 문이 가장 빠릅니다.
FIRST() & FIRSTORDEFAULT()
- First() 문은 조건에 부합하는 첫번째 항목을 반환합니다.
- FirstOrDefault()는 First() 처럼 조건에 맞는 첫 번째 항목을 반환하지만, 결과가 없는 경우 Default 값을 돌려줍니다.
- 이 두 메소드를 여러 방법으로 호출해 보겠습니다.
var query = from person in PersonCollection
where person.Age.TotalDays > 1000
select person;
var result = query.First();
var result = query.FirstOrDefault();
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).First();
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).FirstOrDefault();
var result = PersonCollection.First(p => p.Age.TotalDays > 1000);
var result = PersonCollection.FirstOrDefault(p => p.Age.TotalDays > 1000);
성능
- First(), FirstOrDefault() 또한 메소드에 조건을 포함한 LAMBDA문이 가장 빠른 결과를 보여줍니다.
LAST() & LASTORDEFAULT()
- 마지막 항목을 반환하는 Last(), LastOrDefault()에 대해서도 같은 비교를 진행합니다.
var query = from person in PersonCollection
where person.Age.TotalDays > 1000
select person;
var result = query.Last();
var result = query.LastOrDefault();
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).Last();
var result = PersonCollection.Where(p => p.Age.TotalDays > 1000).LastOrDefault();
var result = PersonCollection.Last(p => p.Age.TotalDays > 1000);
var result = PersonCollection.LastOrDefault(p => p.Age.TotalDays > 1000);
성능
- 메소드에 조건을 포함한 LAMBDA 문이 가장 빠른 결과를 보여줍니다.
결론
- 벤치마크 결과가 보여 주듯이 Any(), First(), FirstOrDefault(), Last(), LastOrDefault() 쿼리를 사용할 때, 아래 처럼 Where() 를 사용하지 않고 각 함수에 직접 조건을 주는 것이 보다 빠른 결과를 보여줍니다.
var result = PersonCollection.FirstOrDefault(p => p.Age.TotalDays > 1000);
728x90
'C# > C# 문법' 카테고리의 다른 글
[C#] Tensorflow Serving C# gRPC Model Status 체크 (0) | 2022.07.23 |
---|---|
[C# 문법] async 및 await 를 사용한 비동기 프로그래밍 (0) | 2022.07.22 |
[C# 문법] MediatR 이란? (0) | 2022.06.03 |
[C# 문법] 명령 파이프라인에 중재자 패턴 사용 (0) | 2022.06.03 |
[C#] CQRS 란? (0) | 2022.05.31 |
이 글을 공유하기