1. 초기화속도 비교
2. 입력속도 비교
3. 일반 Add 속도 비교
4. 일반 Delete 속도 비교
1. 초기화속도 비교
long[] array = new long[10000000]; //5ms
List<long> list = new List<long>(new long[10000000]); //206ms
개수가 많이 필요해서 10,000,000개로 생성
list가 40배나 느리네요. 기껏해야 2~3배일줄 알았는데;;
2. 입력속도 비교
이번에도 개수가 너무 적어서 10,000,000개로 생성
for(int i=0; i< array.Length;i++)
{
array[i] = 1;
}
//155ms
for (int i = 0; i < list.Count; i++)
{
list[i] = 1;
}
//269ms
흔히 쓰이는 코드로 진행했는데
2배정도 차이가 났습니다 그리고 덤으로
int i_max = array.Length;
for (int i=0; i< i_max; i++)
{
array[i] = 1;
}
위 코드는 이 코드랑 속도가 똑같습니다
3. Add 속도 비교
가장 기본적인 코드로 비교해봤습니다
long[] array = new long[48];
long[] array_t;
for (int i = 0; i < 10000; i++)
{
array_t = new long[array.Length+1];
Array.Copy(array, array_t , array.Length);
array_t[array.Length] = 1;
array = array_t;
}
//1346ms
List<long> list = new List<long>(new long[48]);
for (int i = 0; i < 10000; i++)
{
list.Add(1);
}
//4ms
압도적으로 list가 우세하네요 이정도일줄이야;;
하지만 배열을 저렇게 쓰는 사람은 없어서 가장 많이 쓰이는 버퍼 차원으로 접근해봤습니다
long[] array = new long[48];
int index = 47;
long[] array_copy;
for (int i = 0; i < 10000; i++)
{
index++;
if (index == array.Length)
{
array_copy = new long[array.Length*2];
Array.Copy(array, array_copy, array.Length);
array = array_copy;
}
array[index] = 1;
}
//4ms
엥... 이게 아닌데...
그래서 10,000,000개로 검사해봤더니
버퍼사용시 각각 447ms, 480ms으로 기대를 제치고 배열이 더 빠르게 나타났습니다.
아마 내부적으로 리스트가 위 코드랑 동일하지 않은가 싶네요.
4. RemoveAt 속도 비교
역시 이번에도 기본코드부터
long[] array = new long[10048];
long[] array_copy;
int delete_pos = 48;
for (int i = 0; i < 10000; i++)
{
array_copy = new long[array.Length-1];
Array.Copy(array, 0, array_copy, 0, delete_pos);
Array.Copy(array, delete_pos, array_copy, 0 ,array.Length- delete_pos-1);
array = array_copy;
}
//490ms
List<long> list = new List<long>(new long[10048]);
for (int i = 0; i < 10000; i++)
{
list.RemoveAt(48);
}
//486ms
매우 놀랍게도 list가 저 비효율적인 코드와 승부를 보고 있습니다 ㅡ_ㅡ
버퍼사용시 얼마나 차이를 보일까 해봐서 테스트 해봤더니
long[] array = new long[10048];
int size = 10048;
int delete_pos = 48;
for (int i = 0; i < 10000; i++)
{
size--;
for (int j= delete_pos; j< size; j++)
{
array[j] = array[j+1];
}
}
//829ms
오히려 늘어났습니다;;
j+1에서 인터프리터 특성의 느린연산이 발목을 잡나보네요
대신 이 코드는 가비지컬렉터에 부하를 주지 않기 때문에 안정성은 더 높다고 볼수 있습니다
1. 초기화속도 비교 = array가 list보다 40배 빠름
2. 입력속도 비교 = array가 list보다 2배 빠름
3. 일반 Add 속도 비교 = array가 list보다 1.07배 빠름
4. 일반 Delete 속도 비교 = 동일함