개념
컴퓨터 시스템 성능 최적화의 핵심 개념 중 하나로, 캐시 메모리가 효과적으로 동작할 수 있는 이론적 배경
iOS와 같이 제한된 리소스 환경에서 지역성을 고려한 코드 작성이 성능에 큰 영향을 미침.
- Locality란 CPU가 메모리 접근 시 특정 메모리 위치를 중심으로 접근이 집중되는 경향을 의미.
- 이 성질을 기반으로 캐시 메모리가 설계되며 크게 두가지가 있음
| 지역성 종류 | 설명 |
|---|
| 시간적 지역성 (Temporal Locality) | 최근에 접근한 데이터는 다시 접근할 가능성이 높다 |
| 공간적 지역성 (Spatial Locality) | 가까운 주소에 있는 데이터는 곧 접근할 가능성이 높다 |
코드 예시
시간적 지역성 예시
var sum = 0
let a = [1, 2, 3, 4, 5]
for _ in 0..<100000 {
sum += a[2]
}
- a[2]는 한번 캐시에 올라가면 계속 재사용됨
- 시간적으로 가까운 시점에서 같은 데이터에 접근 -> 캐시 히트율 높음 -> 성능 좋음
공간적 지역성 예시
let array = Array(repeating: 1, count: 10000)
var sum = 0
for i in 0..<10000 {
sum += array[i]
}
- 배열의 요소들이 메모리에 연속적으로 존재
- 한번 로드한 캐시 라인에 인접 요소들이 함께 올라감
- 연속적인 인덱스 접근 -> 공간적 지역성 높음 -> 성능 좋음
지역성을 고려하지 않은 코드 예시
let matrix = Array(repeating: Array(repeating: 1, count: 1000), count: 1000)
var sum = 0
for j in 0..<1000 {
for i in 0..<1000 {
sum += matrix[i][j]
}
}
- Swift의 2차원 배열은 내부적으로 행 단위로 저장됨 (row-major order)
- 위 코드는 메모리상 비연속적인 위치에 접근 -> 공간적 지역성 무시
- 캐시 미스 증가 -> 성능저하
지역성을 고려하지 않으면 발생할 수 있는 성능 문제
| 문제 | 설명 |
|---|
| 캐시 미스 증가 | CPU가 데이터를 캐시에서 찾지 못해 RAM 접근이 많아짐 (속도 저하) |
| CPU stall | 메모리 접근 지연으로 인해 CPU가 작업 대기 |
| 배터리 소비 증가 (모바일) | 자주 메모리 접근 시 에너지 소모 증가 |
| 스크롤/렌더링 지연 | 특히 이미지 처리나 테이블 뷰, 콜렉션 뷰에서 지역성 고려하지 않으면 프레임 드랍 발생 |
정리
| 개념 | 설명 | 예시 |
|---|
| 시간적 지역성 | 자주 접근하는 데이터는 또 접근됨 | 변수 재사용, 최근 조회 캐시 |
| 공간적 지역성 | 인접 데이터는 함께 접근됨 | 배열 순차 접근, 스트리밍 처리 |
| 지역성 미고려 코드 | 불연속 메모리 접근 | 행렬의 열 우선 순회 등 |