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.EnumerateFiles
C#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>
두 가지 경우가 있습니다.
은 " " " 를 구현합니다.
ICollection<T>
: 럼럼ICollection<T>.Count
위해 되며 소스 되기 전에ICollection<T>.CopyTo()
이 작업은 매우 효율적이며 메모리 블록을 복사하기 위한 CPU 명령에 매핑될 수 있습니다.그러나 성능 측면에서는 새로운 어레이에 메모리가 필요하며 모든 요소를 복사하려면 CPU 사이클이 필요합니다.이외의 는 알 수 , 「」의입니다.
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)
.if
collection
를 실장하다ICollection<T>
''에ICollection<T>.CopyTo
방법.그래야 한다O(n)
、 、n
컬렉션 길이if
collection
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
'programing' 카테고리의 다른 글
Excel vba에서 python 스크립트를 호출하는 방법 (0) | 2023.04.19 |
---|---|
Bash를 사용하는 가장 좋아하는 명령줄 트릭은 무엇입니까? (0) | 2023.04.19 |
sep=";" 문이 XSL에서 생성된 CSV 파일에서 utf8 BOM을 차단합니다. (0) | 2023.04.14 |
WPF 라디오 버튼(2)(부울 값에 바인딩) (0) | 2023.04.14 |
Git 분리 헤드는 어떻게 고치나요? (0) | 2023.04.14 |