728x90
문제
배열에 대한 용어 설명부터 하자면
- Multidimensional Array는 int[,]로 선언되는 배열이다. Jagged Array와는 달리 정해진 크기만큼의 '행렬'이라고 보면 된다.
- Jagged Array는 int[][]로 선언되는 배열이다. Array of Arrays라고도 한다. 배열로 이루어진 배열이기 때문에 각 요소 배열의 길이가 다를 수 있다.
- Single Array는 int[]로 선언되는 배열이다.
일반적으로 속도 면에서는 빠른순으로 나열하면 Single Array > Jagged Array > Multidimensional Array이다.
아래 내용은 출처 란의 스택오버플로우 글에서 발췌한 것이다.
다음과 같은 요소에 접근하는 코드를 작성했을 때,
static void SetElementAt(int[][] array, int i, int j, int value)
{
array[i][j] = value;
}
static void SetElementAt(int[,] array, int i, int j, int value)
{
array[i, j] = value;
}
IL disassembler로 확인해본 결과는 다음과 같다.
.method private hidebysig static void SetElementAt(int32[][] 'array',
int32 i,
int32 j,
int32 'value') cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: ldelem.ref
IL_0003: ldarg.2
IL_0004: ldarg.3
IL_0005: stelem.i4
IL_0006: ret
} // end of method Program::SetElementAt
.method private hidebysig static void SetElementAt(int32[0...,0...] 'array',
int32 i,
int32 j,
int32 'value') cil managed
{
// Code size 10 (0xa)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: ldarg.2
IL_0003: ldarg.3
IL_0004: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0009: ret
} // end of method Program::SetElementAt
Jagged Array는 단순한 IL instruction으로 구성되어 있고, Multidimensional Array는 함수 호출을 하고 있는것을 알 수 있다.
함수 호출은 단순한 명령어보다 느리기 때문에, Jagged Array가 속도면에서 빠르다는 것을 알 수 있다.
해결방안
Multidimensional Array보다 Jagged Array를 사용하자.
하지만 일반적인 상황에서 Jagged Array를 사용하되, 무작정 고집하는 것 보단 사용하는 환경, .NET 버전, 컴파일러 옵션에 따라서 결과가 다를 수 있으니 벤치마킹이나 프로파일링을 통해 실제로 성능 개선효과가 있는지부터 확인하는 게 좋다.
출처
728x90