프로그램 최적화

1 개요

현재의 컴파일러들은 충분히 똑똑해져서, 적당한 설정을 해 주면 프로그래머를 대신하여 어느 정도 최적화를 해 준다.[1] 최적화된 프로그램들은 최적화되지 않은 프로그램들에 비해 메모리를 적게 사용하거나 실행 시간이 줄어드는 이점이 생긴다. 다만 최적화된 실행파일은 프로그래머가 만든 소스코드와 달라져[2] 디버깅 난이도가 조금 올라간다는 단점이 있다.

그런데 컴파일러는 아쉽게도 인간만큼 똑똑하지 않은지라 프로그램의 구문들을 인식할 수 있지만 프로그램의 흐름을 이해할 수는 없다. 이게 되면 프로그래머들 다 굶어 죽는다 야! 프로그래머들 굶어죽는 소리 좀 안 나개 하라! 컴파일러의 최적화는 최적화 테크닉을 적용 가능한 몇몇 구문들을 인식하면서 실행되는데, 요령있게 짜이지 않은 코드의 경우 컴파일러가 구문을 잘 인식할 수가 없어 자동으로 최적화가 되지 않는다. 이런 식으로 컴파일러의 자동 최적화를 막는 코드들을 '최적화 장애물(optimization blocker)'이라 부른다. 최적화 장애물을 치우는 것은 프로그래머들의 몫이다. 프로그래머들은 온갖 기술과 지식들을 동원해서 최적화 장애물을 치워 컴파일러가 최적화를 잘 할 수 있도록 도와야 한다.

2 컴파일러의 한계

다음 코드를 보자.

<syntaxhighlight lang="cpp" line="1">
void func1(int *xp, int *yp)
{
*xp += *yp;
*xp += *yp;
}

void func2(int *xp, int *yp)
{
*xp += 2 * (*yp);
}

</syntaxhighlight>
  1. 대표적인 C 컴파일러인 GCC 컴파일러의 경우 -O1, -O2 등의 옵션을 통해 최적화된 코드를 작성할 수 있다.
  2. 기능상의 차이점은 전혀 없지만, 흐름이나 순서 등에서 차이가 생길 수 있다. 기능상의 차이가 있다면 문제가 좀 있다