programing

ToList()를 호출할 때 퍼포먼스에 영향이 있습니까?

oldcodes 2023. 4. 19. 23:26
반응형

ToList()를 호출할 때 퍼포먼스에 영향이 있습니까?

「」를 사용하고 ToList()퍼포먼스에 미치는 영향이 고려되어야 합니까?

디렉토리에서 파일을 검색하기 위해 쿼리를 작성했습니다.이 쿼리는 다음과 같습니다.

string[] imageArray = Directory.GetFiles(directory);

,는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.List<>,, 는...을 사용하다

List<string> imageList = Directory.GetFiles(directory).ToList();

이러한 변환을 실시할 때 고려해야 할 퍼포먼스에 대한 영향이나 대량의 파일을 취급할 때만 고려해야 할 영향이 있습니까?이것은 무시할 수 있는 변환입니까?

IEnumerable<T>.ToList()

네, 퍼포먼스에 영향이 있습니다.이것은 O(n) 조작이지만, 퍼포먼스가 중요한 조작에서는 주의가 필요합니다.

ToList()작업이 생성자를 사용합니다.이 생성자는 배열의 복사본을 만들어야 합니다(더 일반적으로).IEnumerable<T> 상에서 T[]또한 일반적으로 바람직하지 않을 수도 있습니다

메모리 청크를 복사하는 것은 매우 빠른 작업이기 때문에, 이것은 방대한 리스트와 차이가 있을 뿐입니다.

한 팁 ★★★★★★★★★★★★★★★★★★★★As »To

에는 LINQ로 As( 등) 및To( 등).로 시작하는 방법To와 같은 에 영향을 줄 수 로 합니다.또, 「퍼포먼스에 영향을 줄 가능성이 있습니다」로 는, 「퍼포먼스에 영향을 줄 수 있습니다」라고 하는 것입니다.As주조나 간단한 조작이 필요하지 않습니다.

타타 の additionList<T>

에서는 어떻게 하면 좋을지 더 하겠습니다.List<T>works works you 、 works works works works 、 works works works works works works works works works works works works works works works works works works works works works works works works works 。

A List<T>또한 필요에 따라 크기를 조정해야 하는 동적 배열이라고 하는 구성을 사용합니다. 이 크기 조정 이벤트는 이전 배열의 내용을 새 배열에 복사합니다.따라서 처음에는 작게 시작하여 필요에 따라 크기가 커집니다.

이것이 및 속성의 차이입니다.Capacity.Count.List<T>은 항상 '일부러'입니다.<= Capacity 목록에되었을 때 를 앞으로 Capacity의, " " "List<T>2번, 2번, 2번, 2번.

toList() 호출 시 퍼포먼스에 영향이 있습니까?

,, 럼, 그. 이론적으로 짝수이다i++퍼포먼스에 영향을 미쳐 프로그램이 잠시 느려집니다.

무인 does does 가 뭐죠?.ToList 할수 수 do do do?

를 호출할 때.ToList 콜, 코드 콜, 코드 호출, 코드 :Enumerable.ToList()은, 「」의 입니다.return new List<TSource>(source)해당 컨스트럭터에서는 최악의 경우 아이템 컨테이너를 통과하여 새로운 컨테이너에 하나씩 추가한다.따라서 동작은 퍼포먼스에 거의 영향을 주지 않습니다.어플리케이션의 퍼포먼스 보틀넥이 되는 것은 불가능합니다.

질문의 코드에 문제가 있는 것은 무엇입니까?

Directory.GetFiles는 폴더를 통과하여 모든 파일의 이름을 즉시 메모리로 되돌립니다.이 경우 문자열 []에 많은 메모리가 소요되어 모든 작업이 느려질 수 있습니다.

그럼 어떻게 해야 할까요?

정정사르 르고객(및 비즈니스 로직)이 폴더 내의 파일 용량이 항상 작다고 확신하는 경우 코드가 허용됩니다.버전을 : 그나나 :: :: but but but but but but but but but but but but but but but but 。Directory.EnumerateFilesC#4 습 c c c c c c c쿼리에 더에 더 할 수 다음과 같이 쿼리에 더 추가할 수 있습니다.

Directory.EnumerateFiles(myPath).Any(s => s.Contains("myfile"))

이름에 "myfile"이 포함된 파일이 발견되는 즉시 경로 검색을 중지합니다.이게 확실히 더 나은 퍼포먼스야.GetFiles.

toList() 호출 시 퍼포먼스에 영향이 있습니까?

. 방식 " " " 를 사용합니다.Enumerable.ToList()새로운 것을 구축하다List<T>IEnumerable<T>물론 퍼포먼스에 영향을 미치는 소스 수집입니다.

</FONT CHANGE:>의 이해List<T>는 퍼포먼스에 미치는 영향이 큰지 여부를 판단하는 데 도움이 됩니다.

List<T>(배열 사용)T[]목록 요소를 저장합니다.는 일단 할 수 어레이는 확장되지 않습니다.List<T>는 초과 크기 배열을 사용하여 목록의 요소를 저장합니다.?List<T>새로운 어레이를 할당해야 하는 기본 어레이 크기를 초과하여 이전 어레이의 내용을 새로운 대형 어레이에 복사해야 목록이 증가합니다.

★★★★★★★★★★★★★★★★★★ ★List<T>로부터 구축됩니다.IEnumerable<T>두 가지 경우가 있습니다.

  1. 은 " " " 를 구현합니다.ICollection<T> : 럼럼ICollection<T>.Count 위해 되며 소스 되기 전에 ICollection<T>.CopyTo()이 작업은 매우 효율적이며 메모리 블록을 복사하기 위한 CPU 명령에 매핑될 수 있습니다.그러나 성능 측면에서는 새로운 어레이에 메모리가 필요하며 모든 요소를 복사하려면 CPU 사이클이 필요합니다.

  2. 이외의 는 알 수 , 「」의입니다.IEnumerable<T>는, 됩니다.List<T>처음에 백업 어레이는 비어 있으며 크기가 4인 어레이가 생성됩니다.이 어레이가 너무 작을 경우 크기가 두 배로 증가하므로 백업 어레이는 다음과 같이 확장됩니다.백업 어레이가 커질 때마다 어레이를 재할당하고 지금까지 저장된 모든 요소를 복사해야 합니다.이 작업은 올바른 크기의 어레이를 즉시 생성할 수 있는 첫 번째 경우에 비해 훨씬 더 많은 비용이 듭니다.

    또, 소스 컬렉션에 33개의 요소가 포함되어 있는 경우, 리스트는 64개의 요소의 배열을 사용해 메모리를 낭비하게 됩니다.

in in in in in in in in in in in 를 구현하는 입니다.ICollection<T>따라서 소스 어레이가 매우 큰 경우를 제외하고 퍼포먼스에 미치는 영향은 우려할 필요가 없습니다. " "ToList()는 소스 하여 "Source Array"로.List<T> even. 케이스의 소장품이라면 가 없습니다.두 번째 케이스의 퍼포먼스도 소규모 컬렉션에서는 걱정할 필요가 없습니다.

다음과 같이 효율적입니다.

var list = new List<T>(items);

「」를하는 .IEnumerable<T> 몇 할 수 있습니다.

  • ★★collection.Count, 「」의 경우는collection는 입니다.IEnumerable<T>강제로 실행됩니다. ifcollection.O(1).

  • ifcollection를 실장하다ICollection<T> ''에ICollection<T>.CopyTo방법.그래야 한다O(n)、 、n컬렉션 길이

  • ifcollection does does does does 。ICollection<T>컬렉션 항목을 반복하여 내부 목록에 추가합니다.

따라서 새로운 목록을 작성해야 하기 때문에 메모리를 더 많이 소비하게 됩니다.최악의 경우, 리스트는 이 리스트가 반복되기 때문입니다.collection각 요소의 복사본을 만듭니다.

퍼포먼스에 미치는 영향이 있습니까?

정확한 시나리오의 문제는 무엇보다도 성능에 대한 진정한 관심사는 드라이브 캐시의 하드 드라이브 속도와 효율성입니다.

그런 관점에서 보면, NO를 고려할 필요가 없을 정도로 그 영향은 무시할 수 밖에 없다.

, 「 」의 기능이 정말로 에만, 「 」의 기능을 사용할 수 있습니다.List<>보다 생산성이 향상되거나 알고리즘이 보다 친숙해지거나 기타 이점이 있을 수 있습니다.그렇지 않으면 아무 이유 없이 일부러 중요하지 않은 성능 히트만 추가하는 것입니다.안 돼요 :) 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아

ToList()는 새로운 하고 요소를 은, 「목록」을 실행하는 것을 합니다.ToList()·소액 컬렉션의 경우, 큰 코스트는 들지 않지만, 대량 컬렉션의 경우 ToList를 사용하면 퍼포먼스에 타격을 줄 수 있습니다.

일반적으로 ToList()는 수집을 List로 변환하지 않으면 작업을 수행할 수 없는 경우를 제외하고는 사용하지 마십시오.예를 들어 콜렉션 전체를 반복하는 경우 ToList를 수행할 필요가 없습니다.

예를 들어 LINQ to SQL을 사용하여 데이터 소스에 대해 쿼리를 실행하는 경우 ToList를 수행하는 비용이 훨씬 더 많이 듭니다.이는 ToList를 LINQ to SQL과 함께 사용하면 필요할 때 항목을 로드하는 대신 즉시 데이터베이스에서 메모리로 로드하기 때문입니다(많은 시나리오에서 유용).

했을 때, 「」는 「」입니다.ToList()무시할 수 있습니다.하지만 다른 시나리오에서는 그렇지 않습니다.그건 어디에 쓰느냐에 따라 다르죠.

  • 을 " " " 로 만듭니다.List<T>여기서의 퍼포먼스는 리스트의 크기에 따라 달라집니다.아, 네, 네, 네.

    이 예에서는 어레이를 호출합니다.어레이를 반복하여 항목을 하나씩 새로 만든 목록에 추가합니다.따라서 성능에 미치는 영향은 파일 수에 따라 달라집니다.

  • 를 호출하는 IEnumerable<T>를 실현합니다.IEnumerable<T>(일부러)

ToList 새 목록을 만들고 요소를 원래 소스에서 새로 만든 목록으로 복사합니다. 따라서 소스 크기에 따라 요소를 원래 소스에서 복사하기만 하면 됩니다.

다른 예를 찾아봅시다.

를 실행할 때 ToList()SQL Profiler 에 prof에 。

var IsExist = (from inc in entities.be_Settings                                
 where inc.SettingName == "Number"                                
 select inc).ToList().Count > 0;

자동 생성된 쿼리는 다음과 같습니다.

SELECT [Extent1].[SettingName] AS [SettingName], [Extent1].[SettingValue] AS [SettingValue] FROM [dbo].[be_Settings] AS [Extent1] WHERE N'Number' = [Extent1].[SettingName]

Select 쿼리는 ToList 방식으로 실행되며 쿼리 결과는 메모리에 저장되며 List의 요소 수를 보고 레코드가 있는지 확인합니다.예를 들어 테이블 내에 관련 기준을 가진 레코드가 1000개 있는 경우 이 1000개의 레코드는 먼저 데이터베이스에서 가져와 개체로 변환된 후 목록으로 던져지고 이 목록의 요소 수만 확인합니다.따라서 이는 매우 비효율적인 선택 방법입니다.

리스트의 퍼포먼스에 관한 것은 아니지만, 고차원 어레이를 사용하고 있는 경우는, 리스트 대신에 해시 세트를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15516462/is-there-a-performance-impact-when-calling-tolist

반응형