프로그래밍언어/C#

C#) List Capacity 테스트 케이스 / list.TrimExcess()

HJH0825 2021. 6. 29. 23:45

Cpaacity를 먼저 설정했을 때와 그냥 사용했을 때에 차이점을 테스트해봤다.

첫 번째 테스트

리스트에 같은 수의 데이터를 넣고 지우 고를 반복했을 때 걸리는 시간 체크하기. 여기 포인트는 미리 정해놓은 Cpaacity의 크기를 넘지 않을때이다.

 

테스트 코드

	long lPre = System.GC.GetTotalMemory(false);
        int tick1 = Environment.TickCount;
        List<int> list = null;
        if (bCapacity)
            list = new List<int>(10000000);
        else
            list = new List<int>();

        for (int k = 0; k < 10; k++)
        {
            for (int i = 0; i < nCount; i++)
            {
                for (int j = 0; j < nCount; j++)
                {
                    list.Add(i + j);
                }
            }
        }
        int tick2 = Environment.TickCount;
        long lAfter = System.GC.GetTotalMemory(false);

        Debug.LogError(string.Format("Capacity Use : {0} | list Count : {1} / Tick : {2}/ Memory : {3}", 
        			bCapacity, list.Count, tick2 - tick1, lAfter - lPre));

1. Capacity을 사용 안 했을 때.

list Count : 10000000 / Tick : 172/ Memory : 134279168

2. Capacity을 사용했을 때.

 list Count : 10000000 / Tick : 109/ Memory : 40001536


테스트 결과

Capacity를 크기를 미리 설정한 케이스가 시간이나 메모리가 더 적게 발생하는 걸 알 수 있다. 

 


 

두 번째 테스트

재 할당될 때 List의 Capacity변화를 테스트해봤다.

 

테스트 코드

        List<int> list = new List<int>();
        Debug.LogError(list.Capacity);
        list.AddRange(new int[4] { 1, 2, 3, 4 });
        Debug.LogError(list.Capacity);
        list.Add(1);
        Debug.LogError(list.Capacity);

처음에 4개의 데이터를 넣고 그 범위를 초과할 때 Capacity를 로그 찍어봤다.

 

테스트 결과

데이터의 수는 4개에서 5개로 1개 증가했지만 현재 사이즈의 2배만큼 Capacity를 할당된 것을 알 수 있다.

 


오늘 테스트 최종 결과

List에 사용하는 최대 크기를 안다면 Capacity를 미리 설정해두는 것이 좋다. List는 현재 가지고 있는 Count수가 초과될 때 기존의 데이터를 복사한 후 다시 2배 사이즈로 재할당하게 된다(기존의 있던 데이터는 가비지 해제 대상으로 잡히게 된다.) 만약 할당된 Capacity를 현재 데이터의 수만큼 변경하고 싶으면 TrimExcess 을 이용한다.