프로그래밍/C#

[C#] 성능개선 팁 List<T>의 Capacity값을 수동조정

ss-pro 2024. 11. 13. 23:55
반응형

C#에서 List<T>의 성능을 최적화하려면, List<T>의 Capacity와 관련된 몇 가지 중요한 고려사항을 이해하고 활용하는 것이 중요합니다. List<T>는 동적으로 크기를 조정하는 컬렉션이지만, 때때로 성능을 개선하려면 초기 용량을 설정하거나 필요한 경우 용량을 미리 늘려야 합니다.

1. 초기 Capacity 설정
List<T>는 기본적으로 4개의 요소를 가지는 초기 용량을 설정합니다. 그러나 많은 요소를 추가할 경우, 내부 배열이 계속해서 크기를 두 배로 늘려야 하므로 성능 저하가 발생할 수 있습니다. 따라서 예상되는 요소의 수를 미리 알고 있다면, List<T>를 생성할 때 초기 Capacity를 설정하는 것이 좋습니다. 

1
2
int estimatedSize = 1000;
List<int> list = new List<int>(estimatedSize);
cs
이렇게 하면 요소를 추가할 때마다 크기가 자동으로 조정되는 것을 방지하고, 성능을 향상시킬 수 있습니다.


2. Capacity 수동 조정
List<T>의 Capacity를 수동으로 늘리거나 줄여서 성능을 최적화할 수 있습니다. 예를 들어, 많은 요소를 추가한 후 불필요한 여유 공간을 줄이거나, 리스트의 크기가 커질 때마다 성능 저하를 방지하기 위해 미리 용량을 늘리는 방법이 있습니다.

1
2
3
4
List<int> list = new List<int>();
 
// 예상보다 많은 요소가 추가될 경우 용량을 수동으로 늘림
list.Capacity = 10000;
cs

만약 요소를 제거하고 나서 여유 용량이 많아진다면, TrimExcess 메서드를 사용해 여유 공간을 줄일 수 있습니다.

1
list.TrimExcess();
cs


3. AddRange 대신 Add
List<T>에 많은 요소를 추가할 때 AddRange를 사용하는 것이 더 효율적일 수 있습니다. AddRange는 내부적으로 요소들을 한 번에 추가하므로, 여러 번 Add를 호출하는 것보다 성능이 좋습니다.

1
2
List<int> list = new List<int>();
list.AddRange(new int[] { 1234 });
cs


4. 큰 리스트에서 RemoveAt 사용 최적화
RemoveAt 메서드는 리스트에서 요소를 제거할 때 뒤에 있는 모든 요소를 이동시키므로, 성능에 영향을 미칠 수 있습니다. 리스트에서 요소를 많이 제거해야 하는 경우, 다른 컬렉션을 사용하거나 List<T>에서 제거할 요소들의 인덱스를 한 번에 처리하는 방법을 고려할 수 있습니다.