개념
구조체 체인(chain)이란 obj->a.b.c.value
와 같이 여러 단계의 구조체 멤버에 접근하는 것을 말합니다. 이러한 체인이 길어질수록 CPU는 각 단계마다 메모리 참조를 수행해야 하므로 성능 저하가 발생합니다.
문제점
- 매 접근마다 전체 체인을 따라가야 함
- 특히 루프 내에서 반복적으로 접근할 때 성능 저하가 심각해짐
- 메모리 계층 구조에서 캐시 미스(cache miss)를 증가시킴
최적화 방법
- 포인터 캐싱: 자주 접근하는 깊은 구조체 멤버의 주소를 로컬 포인터 변수에 저장
- 임시 변수 사용: 값을 자주 읽고 쓰는 경우 로컬 변수에 복사하여 작업 후 다시 저장
최적화 예시
// 비효율적인 방법
for (int i = 0; i < 1000; i++) {
object->department.employee.salary += bonus[i];
}
// 최적화된 방법
int* salary_ptr = &object->department.employee.salary;
for (int i = 0; i < 1000; i++) {
*salary_ptr += bonus[i];
}
성능 향상 이유
- 메모리 주소 계산을 한 번만 수행
- 포인터를 통한 직접 접근으로 중간 단계 참조 제거
- 캐시 지역성(cache locality) 향상
추가 고려사항
구조체 체인 최소화하기
- 자주 접근하는 데이터 구조는 평면화(flattening)하는 것을 고려
- 데이터 지역성을 고려한 구조체 설계
- 핫 패스(hot path)에서는 특히 체인 최소화에 주의
맺는말
간단하지만 위와 같은 구조체 체인 최소화는 특히 임베디드 시스템, 게임 엔진, 고성능 서버 등 성능이 중요한 애플리케이션에서 큰 차이를 만들 수 있습니다. 하지만 항상 가독성과 유지보수성을 함께 고려해야 합니다.
728x90
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
코드 최적화 - 루프 내에서 반복 활용되는 변수 최적화 (0) | 2024.07.26 |
---|---|
코드 최적화 - if-else나 switch-case 대신 배열 인덱스 활용하기 (0) | 2024.07.25 |
[C] warning: implicit declaration of function ‘strnstr’ (0) | 2023.04.22 |
Error: Initialization discards qualifiers from pointer target type (0) | 2015.02.25 |
Debug Assertion Failed! vector subscript out of range Line: 932 (0) | 2014.01.13 |