이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 22799|회답: 1

[출처] Linq: 집합이 비어 있지 않은지 결정하기 위해 Count() > 0을 절대 사용하지 마세요

[링크 복사]
게시됨 2017. 10. 12. 오후 1:25:01 | | | |
Linq 이전에는 보통 집합이 비어 있지 않은지, 즉 집합이 원소를 포함하는지 판단하기 위해 다음과 같은 방법을 사용했습니다:


Length 또는 Count 속성을 사용하면 위 글씨에 문제가 없습니다.

하지만 Linq 시대에는 Enumerable.Count 확장 메서드가 Length와 Count 속성을 "통합"하여 비무효성을 판단하는 다음과 같은 방식으로 작성되었습니다:


이 글쓰기는 괜찮고 잘 작동하지만, 심각한 성능 문제를 일으킬 수 있습니다.

반드시 가능한 것은 아니며, 위의 메서드가 배열, 리스트, 컬렉션 형태로 전달되면 문제가 발생하지 <T>않는다는 점을 유의하세요<T>.



그렇다면 언제 문제가 생길까요? 다음 방법들을 살펴보겠습니다:


호출 때:



실행 속도는 꽤 느릴 것이고, 제 컴퓨터가 소스 코드를 실행하는 데 약 70초가 걸렸습니다. Count() > 0.


분석해 보면 GetNums 코드 5행의 yield return가 int를 실행한다는 것을 알 수 있습니다. 맥스밸류, 꼭 필요한가요?

사실, 한 원소를 반환하는 한 집합이 비어 있지 않으므로 모든 원소를 반환할 필요가 없다고 결론 내릴 수 있습니다.

그렇다면 어떻게 판단해야 할까요? Enumerable.any 확장 메서드를 사용할 수 있습니다:



SomeAction 메서드를 다음과 같이 수정하세요:



다시 부르면 실행 시간이 거의 없다는 것을 알 수 있습니다.


요약하자면, Count() > 0은 예일 리턴에 직면할 때 필연적으로 성능 문제를 겪게 됩니다.






이전의:C# 세 타이머 구현
다음:js 문자열 투 데이트와 데이트 플러스 데이트
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com