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 버전, 컴파일러 옵션에 따라서 결과가 다를 수 있으니 벤치마킹이나 프로파일링을 통해 실제로 성능 개선효과가 있는지부터 확인하는 게 좋다.

 

출처

Differences between a multidimensional array "[,]" and an array of arrays "[][]" in C#? - Stack Overflow

 

 

728x90