오버헤드(overhead)와 스택 오버플로우(Stack Overflow), 왜 발생하고 어떻게 해결할까?
2025. 3. 4. 22:13ㆍ개발/개념 및 기법
728x90
반응형
오버헤드(overhead)란?
어떤 작업이나 시스템을 운영할 때 추가적으로 드는 비용, 시간 메모리 같은 리소스를 의미한다.
> 코드 실행 오버헤드
- 불필요하게 많은 객체 생성 시 발생
- 복잡한 연산 수행 시 발생
⇒ 결과적으로 실행 속도가 느려짐
> 메모리 오버헤드
- 필요 이상으로 큰 데이터 로드할 때 발생
- 캐시를 많이 사용할 때 발생
⇒ 결과적으로 메모리가 낭비됨
> 네트워크 오버헤드
- 짧은 데이터를 보내는데도 요청/응답을 위한 추가적인 정보가 많을 때 발생
⇒ 결과적으로 더 많은 트래픽이 발생함
대충 “뭔가를 하려는데 쓸데없이 부담되는 짐이 추가된다” 정도의 느낌.
오버헤드 성능 최적화 시 고려해야 할 사항
- 재귀보다는 반복문 사용 (StackOverflow 방지)
- 불필요한 객체 생성 줄이기 (GC 부하 감소)
- 쓰레드보다는 코루틴 사용 (경량화)
스택 오버플로우(Stack Overflow)란?
호출 스택(Stack)이 가득 차서 더이상 새로운 함수를 호출할 수 없을 때 발생하는 오류
- 스택에는 함수 호출 정보(지역 변수, 매개변수, 반환 주소 등)를 저장함.
- 함수가 호출될 때마다 스택에 쌓이고, 함수가 종료되면 스택에서 제거됨.
스택 오버플러우를 방지하는 방법
- 재귀 호출을 사용할 때는 반드시 종료 조건을 명확히 설정
- 너무 깊은 재귀는 꼬리 재귀(tailec)로 최적화 ⇒ 코틀린 (참고: 2023.02.24-[Kotlin]tailrec(꼬리재귀))
- 가능하면 반복문으로 대체하여 스택을 사용하지 않도록 설계
⇒ 그렇다고 반복문의 성능이 더욱 좋다는 것은 아니다.
트리 탐색과 같은 경우에는 재귀 함수의 성능이 월등히 좋다.
다만, 재귀의 깊이가 깊어질 경우에는 반복문으로 최적화 하는 것 !!

728x90
반응형
'개발 > 개념 및 기법' 카테고리의 다른 글
보이지 않는 문자들의 연합: 유니코드 이야기 (1) | 2025.03.21 |
---|---|
메타 프로그래밍 리플렉션(Reflection)이란? (0) | 2025.03.12 |
네트워크 API 통신할 때 suspend 함수 vs Flow (0) | 2025.02.19 |
KMP vs CMP (1) | 2025.01.25 |
Kotlin Multiplatform (KMP) (0) | 2025.01.24 |