[C# 문법] Linq 성능 개선

참고


개요

  • 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

이 글을 공유하기

댓글

Designed by JB FACTORY