개념
전역 변수나 static 변수는 메모리 계층에서 지역 변수보다 접근 비용이 높을 수 있으며, 컴파일러 최적화가 제한될 수 있습니다.
문제점
- 전역/static 변수는 캐시 효율성이 낮을 수 있음
- 컴파일러가 레지스터에 변수를 할당하기 어려움
- 멀티스레딩 환경에서 메모리 동기화 오버헤드 발생 가능
- 컴파일러의 최적화 기회 감소
최적화 방법
- 지역 변수로 복사: 루프 시작 전에 전역 값을 지역 변수로 복사
- 작업 완료 후 다시 저장: 모든 계산이 끝난 후 결과를 전역 변수에 한 번만 저장
- 변수 범위 최소화: 필요한 가장 좁은 범위에서만 변수 선언
예시
// 비효율적인 방법
for (int i = 0; i < 1000; i++) {
global_total += data[i];
global_count++;
}
// 최적화된 방법
int local_total = global_total;
int local_count = global_count;
for (int i = 0; i < 1000; i++) {
local_total += data[i];
local_count++;
}
global_total = local_total;
global_count = local_count;
성능 향상 이유
- 지역 변수는 CPU 레지스터에 저장될 가능성이 높음
- 메모리 접근 횟수 감소
- 컴파일러가 더 적극적인 최적화 수행 가능
- 캐시 지역성 향상
추가 고려사항
register
키워드는 현대 컴파일러에서 대부분 무시됨- 컴파일러 최적화 플래그(-O2, -O3 등) 활용
- 변수 타입과 크기도 성능에 영향을 미침
맺는말
간단하지만 위와 같은 루프 내에서 반복 활용되는 변수 최적화를 적용하면 특히 임베디드 시스템, 게임 엔진, 고성능 서버 등 성능이 중요한 애플리케이션에서 큰 차이를 만들 수 있습니다. 하지만 항상 가독성과 유지보수성을 함께 고려해야 합니다.
728x90
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
코드 최적화 - if-else나 switch-case 대신 배열 인덱스 활용하기 (0) | 2024.07.25 |
---|---|
코드 최적화 - 구조체 변수 사용 시 체인 최소화하기 (0) | 2024.07.24 |
[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 |