* 이 강의는 비전공 웹싸개의 개인적인 견해가 포함되어 있음


오늘의 주제는 바로 Branchless 프로그래밍이다. 말 그대로 브랜치 없이 프로그래밍 해보자란 뜻임.


그럼 branch는 뭐냐? if, switch, 삼항연산자처럼 조건에 따라 다른 코드를 실행하게 되는 분기점을 말함.


근데 이런 if, switch같은 branch들이 니 코드를 꽤 많이 느려지게 함..


일단 왜 느려지냐?????


CPU는 현재 명령어를 실행하면서 다음 명령어를 미리 읽어서 준비함. 이걸 명령어 프리패치라 함


명령어 프리패치를 하다가 if 나오면 cpu 입장에선 어떤 명령어를 load해야할지 알 수가 없음.


그래서 둘 중 어떤 경로로 가야할지 예측을 해서 일단 명령어를 로드해놓고 만약 예측이 맞으면 좋고,


예측이 틀리면 로드되어있는 명령어를 flush하고 실제 실행할 명령어를 다시 load함. 이걸 분기예측이라 함


문제는 분기예측이 틀렸을때 명령어를 flush하고 다시 load하는 이 과정이 엄청 느리기 때문에 코드 실행 전체가 느려질 수 있음.


그래서 어떻게 해야하냐?


if 문을 안 쓰면 됨 ㅋㅋ


int min( int a, int b)

{

if(a < b)

return a;

else

return b;

}


이런 코드가 있을 때, cpu는 return a 부분과 return b 중 어느 걸 프리 패치 할 지 알 수가 없음..


따라서 if문을 없앤 cpu 최적화 코드는 아래와 같음


int min(int a, int b)

{

return a*(a<b)+b*(b<=a)

}


가독성은 똥망이지만 실제 c++ 로 컴파일 해서 루프 안에서 돌려보면 시간차이가 유의미하게 남


예를 들면 이런 식으로 수 많은 곳에 적용 가능함.


특히 문자열 처리할때 switch나 if문 나열해놓은 코드들은 branchless하게 짜면 2배까지도 성능차이를 볼 수 있음


하지만 이런 걸 웹싸개가 할 필요가 있느냐???


할 필요도 없고 해서도 안됨.


코드를 후자처럼 짠다? 퇴사권고 당할 수 있으니 조심