오버헤드(overhead)와 스택 오버플로우(Stack Overflow), 왜 발생하고 어떻게 해결할까?

2025. 3. 4. 22:13개발/개념 및 기법

728x90
반응형

오버헤드(overhead)란?

어떤 작업이나 시스템을 운영할 때 추가적으로 드는 비용, 시간 메모리 같은 리소스를 의미한다.

> 코드 실행 오버헤드

  • 불필요하게 많은 객체 생성 시 발생
  • 복잡한 연산 수행 시 발생

⇒ 결과적으로 실행 속도가 느려짐

> 메모리 오버헤드

  • 필요 이상으로 큰 데이터 로드할 때 발생
  • 캐시를 많이 사용할 때 발생

⇒ 결과적으로 메모리가 낭비됨

> 네트워크 오버헤드

  • 짧은 데이터를 보내는데도 요청/응답을 위한 추가적인 정보가 많을 때 발생

⇒ 결과적으로 더 많은 트래픽이 발생함

 

대충 “뭔가를 하려는데 쓸데없이 부담되는 짐이 추가된다” 정도의 느낌.

오버헤드 성능 최적화 시 고려해야 할 사항

  • 재귀보다는 반복문 사용 (StackOverflow 방지)
  • 불필요한 객체 생성 줄이기 (GC 부하 감소)
  • 쓰레드보다는 코루틴 사용 (경량화)

스택 오버플로우(Stack Overflow)란?

호출 스택(Stack)이 가득 차서 더이상 새로운 함수를 호출할 수 없을 때 발생하는 오류

  • 스택에는 함수 호출 정보(지역 변수, 매개변수, 반환 주소 등)를 저장함.
  • 함수가 호출될 때마다 스택에 쌓이고, 함수가 종료되면 스택에서 제거됨.

스택 오버플러우를 방지하는 방법

  • 재귀 호출을 사용할 때는 반드시 종료 조건을 명확히 설정
  • 너무 깊은 재귀는 꼬리 재귀(tailec)로 최적화 ⇒ 코틀린 (참고: 2023.02.24-[Kotlin]tailrec(꼬리재귀))
  • 가능하면 반복문으로 대체하여 스택을 사용하지 않도록 설계

⇒ 그렇다고 반복문의 성능이 더욱 좋다는 것은 아니다.

트리 탐색과 같은 경우에는 재귀 함수의 성능이 월등히 좋다.

다만, 재귀의 깊이가 깊어질 경우에는 반복문으로 최적화 하는 것 !!

 

728x90
반응형