읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다.
  • 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

호출(캐싱)에 따른 연산 효율

컴파일로 쪽에서 최적화해주지 않는다고 가정하자. 2차원 배열 원소들의 총합을 구할 때 어떻게 호출해야 효율적인가.

// Function 1 
int fun1(int arr[R][C]) 
{ 
    int sum = 0; 
    for (int i=0; i<R; i++) 
      for (int j=0; j<C; j++) 
          sum += arr[i][j]; 
} 

// Function 2 
int fun2(int arr[R][C]) 
{ 
    int sum = 0; 
    for (int j=0; j<C; j++) 
      for (int i=0; i<R; i++) 
          sum += arr[i][j]; 
} 

두 함수의 차이점은 함계를 구하기 위해 주소를 호출하는 반복문의 형태가 조금 다르다. fun1 함수는 row에 대해 모든 원소를 호출한 뒤 다음 row로 넘어가는 반면 fun2 함수는 같은 index에 대해 모든 row를 순차적으로 호출한다. C/C++ 언어 등은 저장 방식에서 볼 수 있듯이 row를 기반으로 저장한다. fun1 함수는 메모리에 1개 row를 저장하여 모든 원소에 접근한 뒤 다음 row로 넘어가면 되지만 fun2는 한 개의 row를 저장하고 1개의 값에 대해 접근한 뒤 다음 row로 진행하기 때문에 다음 col 연산할 때 같은 배열을 다시 메모리에 저장해야 한다. 그러므로 fun1이 fun2에 비해 효율적이다.

참고자료

  1. Performance of loops (A caching question)

+ Recent posts