글 작성자: 써니루루

example source project :

 

ArrayList는 값을 object형식으로 방식해서 받게 되어 모든 타입을 담을 수 있다.

하지만 Boxing이 일어나는데 이러한 빈번한 Boxing을 막기 위해 우리는 Generic에 있는 List<type>을 이용한다.

 

다음은 Boxing처리되는 ArrayList와 Boxing되지 않는 Generic List<>의 비교를 보도록 한다.

 

 

Boxing 되는 예 (ArrayList.Add(object))

 

Boxing 되지 않는 예 (List<RGB>.Add(RGB))

 

 

실행 결과

 

실행 결과 대략적으로 6배 정도의 속도 차이를 보인다.

 

예제 소스

using System;

using System.Collections;

using System.Collections.Generic;

 

namespace BoxingTest

{

struct RGB

{

public int red;

public int green;

public int blue;

 

public RGB(int red, int green, int blue)

{

this.red = red;

this.green = green;

this.blue = blue;

}

 

public override string ToString()

{

return red.ToString("X") + green.ToString("X") + blue.ToString("X");

}

}

 

class Program

{

static ArrayList boxValue;

static List<RGB> noBoxValue;

 

static void Main(string[] args)

{

DateTime start;

DateTime middle;

TimeSpan end;

 

RGB rgb = new RGB(255, 255, 255);

 

#region None Boxing

Console.WriteLine("박싱되지 않는 List<RGB>.Add(RGB)");

noBoxValue = new List<RGB>();

 

start = DateTime.Now;

 

for (int i = 0; i < 10000000; i++)

noBoxValue.Add(rgb);

 

middle = DateTime.Now;

 

end = middle - start;

Console.WriteLine("시작 = {0}, = {1}, 경과시간 = {2}", start.ToString("hh:mm:ss"),

middle.ToString("hh:mm:ss"),

end.ToString());

#endregion

 

#region Boxing

Console.WriteLine("박싱되는 ArrayList.Add(object)");

boxValue = new ArrayList();

 

start = DateTime.Now;

 

for (int i = 0; i < 10000000; i++)

boxValue.Add(rgb);

 

middle = DateTime.Now;

end = middle - start;

 

Console.WriteLine("시작 = {0}, = {1}, 경과시간 = {2}", start.ToString("hh:mm:ss"),

middle.ToString("hh:mm:ss"),

end.ToString());

#endregion

}

}

}