최근 한 개발자가 C언어로 작성된 워드 카운터(wc) 프로그램의 성능을 획기적으로 개선하여 화제가 되고 있습니다. 이 개발자는 프로그램의 핵심 로직에서 '분기(branch)'를 제거하는 최적화 기법을 적용해 기존 대비 2.6배 빠른 속도를 달성했습니다. 이는 프로세서의 분기 예측(branch prediction) 실패로 인한 성능 저하를 줄이고 명령어 파이프라인(instruction pipelining) 효율을 극대화한 결과입니다.
최적화의 핵심은 조건문(if-else)을 사용하지 않고 워드 경계를 감지하는 것입니다. 기존 코드에서는 `fgetc`를 반복 호출하며 문자를 읽고 `isalnum()` 함수로 알파벳/숫자인지 확인한 후 조건문을 통해 워드 수를 증가시켰습니다. 하지만 최적화된 '분기 없는(branchless)' 버전에서는 입력 스트림을 0(공백)과 0이 아닌 값(단어)의 연속으로 보고, 두 개의 샘플 윈도우를 이용한 유사 필터(pseudo-filter) 방식으로 0에서 0이 아닌 값으로 전환되는 '상승 에지(rising edge)'를 감지하여 워드 카운트를 증가시킵니다. 이 방식은 조건 분기 없이 산술 연산만으로 워드 경계를 판단하게 하여, 1천만 단어 파일 처리 시 2.6배의 속도 향상을 가져왔습니다.
이러한 저수준(low-level) 최적화는 단순히 코드를 간결하게 만드는 것을 넘어, 현대 컴퓨터 아키텍처의 특성을 이해하고 활용하는 것이 얼마나 중요한지 보여줍니다. 프로세서는 다음 실행될 명령어를 미리 예측하여 파이프라인에 채워 넣는데, 조건문이 많으면 예측 실패 확률이 높아지고, 이는 파이프라인을 비우고 다시 채우는 비용으로 이어져 성능 저하를 초래합니다. 분기 없는 코드는 이러한 예측 실패를 원천적으로 줄여 CPU 자원을 더욱 효율적으로 사용하게 하며, 임베디드 시스템이나 고성능 컴퓨팅(HPC)처럼 자원이 제한적이거나 속도가 중요한 환경에서 특히 유용하게 활용될 수 있습니다.