C# 개발자로서 성능 최적화는 중요한 주제 중 하나입니다. 특히 대규모 데이터를 처리하는 애플리케이션을 개발하는 경우, 데이터 구조의 최적화가 성능 향상에 중요한 역할을 합니다. 이 글에서는 C#에서 데이터 구조를 최적화하여 성능을 향상시키는 방법에 대해 알아보겠습니다.
1. ArrayList에서 List로의 전환
기존에는 ArrayList
를 사용하여 다양한 유형의 데이터를 담았지만, .NET Framework 2.0 이후 List<T>
를 사용하면서 형식 안전성을 확보할 수 있습니다. List<T>
는 특정 형식으로 제한된 컬렉션을 지원하므로 메모리 사용량이 적고 성능도 우수합니다.
// ArrayList
ArrayList arrayList = new ArrayList();
arrayList.Add(1);
arrayList.Add("hello");
// List<T>
List<int> intList = new List<int>();
intList.Add(1);
List<string> stringList = new List<string>();
stringList.Add("hello");
2. 배열의 초기 용량 설정하기
배열의 길이가 동적으로 확장되는 경우, 성능 저하의 요인이 될 수 있습니다. 이를 방지하기 위해 초기 용량을 설정하여 메모리 할당과 복사를 최소화할 수 있습니다.
List<int> numbers = new List<int>(1000); // 초기 용량 설정
3. Dictionary 대신 SortedDictionary 또는 SortedList 사용하기
검색 기능이 많이 사용되는 경우 Dictionary
대신 SortedDictionary
또는 SortedList
를 사용하여 성능을 향상시킬 수 있습니다. 이는 검색과 정렬에 더 효율적이기 때문입니다.
SortedDictionary<string, int> dictionary = new SortedDictionary<string, int>();
SortedList<string, int> sortedList = new SortedList<string, int>();
4. 구조체 활용하기
클래스보다 작은 데이터 형식이 필요할 때는 구조체를 활용하여 메모리를 절약하고 성능을 향상시킬 수 있습니다.
struct Point
{
public int X;
public int Y;
}
Point point = new Point { X = 10, Y = 20 };
5. 병렬 처리를 위한 Concurrent 컬렉션 사용하기
병렬 처리를 지원하는 ConcurrentQueue
, ConcurrentStack
, ConcurrentDictionary
등의 컬렉션을 사용하여 스레드 안전성을 보장하고 성능을 향상시킬 수 있습니다.
ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();
concurrentQueue.Enqueue(1);
C#에서 데이터 구조를 최적화하여 성능을 향상시키는 방법에 대해 알아보았습니다. 이러한 최적화는 대규모 데이터를 다루거나 성능이 중요한 애플리케이션에서 매우 유용합니다.
참고 문헌:
- https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=net-6.0
- https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?view=net-6.0