[ CnUnix ] in KIDS 글 쓴 이(By): touch (남 기 원) 날 짜 (Date): 1994년12월13일(화) 23시16분50초 KST 제 목(Title): [A] C-compiler의 -g/-O 옵션 C 컴파일러의 -g나 -O 옵션에 대해서는 도사가 아니더라도 매뉴얼을 보시면 (% man cc) 아실 수 있습니다. 먼저 -g를 사용하면 -O는 무시된다는 것을 알려드리면서 시작하겠습니다. 사용하시는 시스템이 IBM이라고 하셨는데, 제 주위에는 IBM기계가 없으니 같은 System V 계열인 Silicon Graphics Inc.의 IRIS와, BSD 계열인 Sun의 경우를 예로 들겠습니다. ------------------------------------------------------------------------------ (1) IRIS의 IRIX (System V) -g 옵션은 -g0, -g1, -g2, -g3의 네 단계가 있고, ^^^(default) -O 옵션도 -O0, -O1, -O2, -O3의 네 단계가 있습니다. ^^^(default) -g0: no symbol table. -g와 -O 옵션이 다 없으면 default로 선택됨 -g1, -g2: 심벌 테이블을 만들고 최적화(-O)는 무시. -g는 -g2를 의미하고 -g1은 -g2보다 조금 적은 내용의 심벌 테이블을 생성 -g3: 최적화된 코드에 심벌 테이블을 만들기 때문에 심벌 테이블은 생성하나 dbx를 이용한 디버깅은 곤란함. -O, -O1, -O2, -O3 모두와 함께 사용가능 -O0: no optimization -O1: 빠른 시간 안에 할 수 있는 optimization은 다 하라는 옵션 (default) -O2: 흔히 생각하는 최적화의 최고 단계 -O3: 전체 프로그램을 라이브러리까지 모조리 묶어서 최적화. .o만을 생성하는 -c 옵션은 사용불가. Shared library mode도 사용불가. 사용예: % cc -non_shared -O3 a.c b.c ... z.c (주) 프로그램 개발이 끝났을 때, distribution 직전에 최종적으로 컴파일할 때, shared library를 사용하지 않는 것이 더 낫다고 판단될 경우 사용하기에 적합 (2) SUN의 SunOS (BSD) 심벌 테이블은 -g(for dbx)와 -go(for adb) 옵션에 의해 만들어집니다. -O 옵션은 -O1, -O2, -O3, -O4의 네 단계가 있습니다. ^^^(default) -O1: 어셈블리 레벨의 최적화 -O2: 코드 생성 이전의 전반적인 최적화 (default) -O3: -O2와 같으나, 외부 변수(external variables)에 대한 최적화까지 고려 -O4: -O3와 같으나, pointer assignment의 결과까지 고려 ------------------------------------------------------------------------------ 심벌 테이블이 실행 시간에 미치는 영향은 다음 테스트 결과를 보시면 쉽게 아실 수 있을 겁니다. /* * A Sample C code (a.c) */ main() { int i; for (i = 0; i < 10000000; i++) do_something(); } do_something() { int a, b, c; a = 10; b = 3; /* a redundant assignment, to be removed by optimization */ c = 4; b = a * c; } /* * End of the C code */ ---------------- Silicon Graphics Inc.의 Indigo-2에서의 결과 ---------------- % cc -O2 a.c % time a.out 1.1u 0.0s 0:01 103% 0+0k 0+0io 0pf+0w ^^^^ % cc -g0 a.c % time a.out 2.0u 0.0s 0:01 105% 0+0k 0+0io 0pf+0w ^^^^ % cc -g a.c % time a.out 3.4u 0.0s 0:03 102% 0+0k 0+0io 0pf+0w ^^^^ 그럼, 조금이나마 도움이 되었으면 합니다. |