티스토리 뷰
컴파일러 캐시(ccache)와 gcc 3.4 이상이나 Visual Studio가 지원하는 미리 컴파일된 헤더(Precompiled Header; pch)의 주 목적은 컴파일 속도를 높히는데 있다.
간단히 이들의 원리를 설명하자면, 컴파일러 캐시는 PATH상에서 먼저 설치 돼있는, gcc로 이름이 바뀌어 있는 ccache가 gcc를 실행시킬때 수행되어 PATH의 이하 부분에 오는 실제 gcc를 자식 프로세스로 실행하면서, gcc의 버전, gcc의 전처리 결과(gcc -E) command line 인자 등을 분석하여 동일한 실행 명령과 전처리 결과가 오면, 컴파일을 수행하지 않고 이전에 컴파일 결과로 나온 목적파일(Object file)을 현재 시각으로 복사해서 만들어주는 일을 한는 것이며,
미리 컴파일된 헤더(pch)를 사용하는 것도 이와 비슷하게, 모든 파일의 첫줄에 #include "std.h" 와 같은 헤더를 포함시키고, 같은 명령인자로 수행할 경우 항상 같은 전처리 및 목적 코드를 만들어내는 조건을 만족시켜 std.h 로 생성된 부분을 미리 컴파일해두고 다음 파일 컴파일때 동일한 부분에 대해서 저장해 둔 중간 처리 결과를 바로 이용하여 결과를 공유하는 방법이다.
ccache의 경우 모든 파일을 처음 컴파일 할 경우 아무런 속도 향상을 기대할 수 없다. 동일한 파일에 대해서 두번째부터는 실제로 약 1/5정도로 단축되는데, 이는 pch를 이용한 것 보다 항상 빠른 결과를 가져온다. (컴파일을 전혀 하지 않으므로 자명한 것 아닌가.)
pch를 사용하는 경우에 대한 그림이다. 이 경우 ccache를 이용한다면, hdrx.h 하나만 고쳐도 file1.c, file2.c 의 전처리 결과가 모두 달라지므로 처음부터 새로이 컴파일하게 된다. 하지만, pch를 사용하게 되면, file1.c 를 컴파일한 결과가, file2.c에도 이용되므로 속도가 빨라지게 되는 것이다.
만약 이 헤더파일의 실제 의존관계를 고려해서 std.h 없이 작성하였다고 보자.
hdry.h 는 두 파일에 모두 포함되지만 hdrx.h, hdrz.h 는 각각 file1.c, file2.c에만 의존적이라 생각한다면, hdrx.h 를 고칠 때, 전처리 결과 file2.c 에 대한 코드는 동일하게 되나 file1.c 는 그렇지 않게 된다. 따라서 file2.c 컴파일은 실제 복사만 일어나게 되며, 컴파일 과정이 없게 된다. ccache 를 이용한다면, 되도록 소스에서 필요한 헤더만 포함시켜 쓰는 것이 캐시 히트율을 높이게 된다.
ccache를 이용하든, precompiled header를 이용하든 소스가 정리되는 것은 중요한 것이지만, 아무것도 사용하지 않던 시절, 위 방법들은 다음과 같은 장점이 있어서 호불호가 결정되었다.
std.h 를 두는 경우: 소스가 깔끔해진다. include 순서(있다는게 별로 좋지 않지만)를 한 곳에서 정할 수 있다.특히나 std.h 의 도입은 pch와 더불어 많이 사용하게 되었는데, 그것이 pch를 사용하지 않는 상황에서도 습관적으로 사용되었다. 그러나 이것은 불필요한 컴파일을 가져오기 때문에 전체 컴파일 속도 향상에는 기여하는 바가 없게 된다. 만일 ccache를 쓰게 된다면, 더더욱 std.h 를 사용하는 것보다는 될 수 있으면 의존관계가 없는 헤더들은 제거하려는 시도를 하는 것이 좋으며, 따라서 섬세하게 코드를 작성하는 습관을 기를 수도 있게 된다.
std.h 없는 경우: 불필요한 전처리 과정이 생략되어 컴파일의 군더더기가 없다. 다만, 코드의 앞부분이 항상 지저분하다.
gcc 3.4 를 쓰는 것이 아직 일반화되지 않은 상황에서 Linux, Unix 계열에서는 아직 pch의 활용도는 그다지 높지 않다. 최근의 ccache 를 사용하는 추세를 힘입어 볼 때, 그다지 많이 사용될 것 같지는 않아 보인다. 그 이유는 사용자가 코드에 인위적으로 맨 앞 줄에 넣어야하는 조건을 항상 의식하고 코딩해야하기 때문에 더욱 신경쓸일이 많지만, 지금까지 만들어온 코드들은 그런 코드가 별로 없으니 ccache를 선택할 이유가 더 크지 않은가?
ccache를 잘 써보세.
- Total
- Today
- Yesterday
- 오픈소스
- 대화
- BlogAPI
- SSO
- 킹벤자민
- 식물
- nodejs
- VIM
- Tattertools plugin
- 구근
- Subversion
- 퀴즈
- Linux
- MySQL
- OpenID
- ssh
- 덴드롱
- macosx
- 벤자민
- 클레로덴드럼
- perl
- 커피
- 디버깅
- JavaScript
- tattertools
- TCP/IP
- writely
- 수선화
- url
- SVN
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |