티스토리 뷰

개요

최신 컴파일러는 최신 하드웨어에서 효율적으로 실행되도록 코드를 최적화하는 환상적인 작업을 수행한다. 코드가 단순하고 예측 가능할 때 최적화 기능이 뛰어나며 코드가 복잡할수록 컴파일러의 최적화 기능을 통해 얻을 수 있는 도움은 줄어든다. 대다수 컴파일러 최적화 도구는 코드 블록의 순환 복잡도cyclomatic complexity가 임겟값을 초과하면 최적화 시도를 포기한다.

모던 소프트웨어 엔지니어링 p203

 

책을 읽다가 위 문장이 인상적이라 순혼 복잡도를 정리해본다. 코드가 단순하고 가독성이 좋은 것도 알고, 컴파일러의 최적화 기능도 알고 있었는데 이 둘이 이렇게 연결될 수 있다는 생각을 못했다. 위 문장을 다음과 같이 해석해본다.

개발자가 아둥바둥 코드를 최적화하여 성능을 개선하려다 코드가 복잡해지고 가독성까지 해칠바에야, 코드를 가독성좋고 단순하게 짠 다음에 최적화는 컴파일러에게 맡기는 것이 낫다.

순환복잡도란?

순환복잡도cyclomatic complexity는 프로그램의 복잡도를 수치로 나타낸 것이며 코드 안에 있는 독립적인 경로의 수를 의미한다. 풀어쓰면 “이 코드에는 테스트해야 할 서로 다른 흐름이 몇 개나 있는가?” 하는 것이다.

계산 공식

M = E - N + 2P
  • M = 순환 복잡도
  • E = 간선(Flow Chart 상에서의 화살표, 흐름)
  • N = 노드(Flow Chart 상의 박스, 실행 단위)
  • P = 독립적인 부분(보통 하나의 함수면 1)

또 다른 공식

간단히, 조건문(if, while, for, case 등)의 개수 + 1 로도 대략 계산할 수 있다.

예시:

func example(x int) int {
    if x > 0 {
        return 1
    } else if x == 0 {
        return 0
    } else {
        return -1
    }
}
  • if, else if 조건문 2개이기에 순환 복잡도는 2 + 1 = 3
  • 따라서 테스트 케이스가 최소 3개 필요하다 (x > 0, x == 0, x < 0)

순환 복잡도가 중요한 이유

  • 순환 복잡도가 높으면 코드가 복잡하다는 말이고 버그 발생 확률이 증가한다.
  • 10을 넘으면 “리팩터링을 고려하라”고 권장하는 경우가 많다
  • 코드 리뷰나 커버리지 분석할 때 기준으로 삼기도 한다.
반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함