代碼優化的目的是改善程序的執行性能。gcc提供的代碼優化功能非常強大,它通過參數-On來控制優化代碼的生成,其中n為優化級別的整數,比較典型的范圍是從0變化到2或3(與版本有關)。
編譯時通過使用選項-O可以告訴gcc同時減小代碼的長度和執行時間,其效果等價于-O1,在這一級別上能夠進行的優化類型雖然取決于目標處理器,但一般都會包括線程跳轉和延遲退棧兩種優化。選項-O2除了完成所有-O1級別的優化外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項O3除了完成所有-O2級別的優化外,還包括循環展開和其他一些與處理器特性相關的優化工作。數字越大優化的等級越高,程序的運行速度更快。一般采用-O2選項,因為它在優化長度、編譯時間和代碼大小之間取得了一個比較理想的平衡點。
借助Linux的time命令,可以大致統計出該程序在運行時所需要的時間,注意此時最好退出其它程序。
[root@localhost work]# gcc -Wall hello.c -o hello
[root@localhost work]# time ./hello
hello world!
real? 0m0.011s
user 0m0.000s
sys?? 0m0.002s
//優化如下:
[root@localhost work]# gcc -Wall -O hello.c -o hello
[root@localhost work]# time ./hello
?
[root@localhost work]# gcc -Wall -O1 hello.c -o hello
[root@localhost work]# time ./hello
?
[root@localhost work]# gcc -Wall -O2 hello.c -o hello
[root@localhost work]# time ./hello
?
[root@localhost work]# gcc -Wall -O3 hello.c -o hello
[root@localhost work]# time ./hello
real:進程總的執行時間,它和系統負載有關(包括了進程調度,切換的時間)
user:被測量的進程中用戶指令的執行時間(CPU的運行,計算等)
sys:被測量的進程中內核代用戶指令執行的時間,user和sys的和被稱為CPU時間(系統調用消耗的時間)。
注意:盡管gcc的代碼優化功能很強大,但還是要求能夠手工編寫出高質量的代碼(很重要),如果自己編寫的代碼簡潔,邏輯性強,則編譯器就不會做更多的工作,甚至不需要進行優化。而且在一些場合中不允許對代碼進行優化:程序開發的時候,優化等級越高,消耗在編譯的時間上也就越長,因此開發的時候不建議對代碼進行優化,只有軟件開發結束的時候,才考慮對最終代碼進行優化。跟蹤調試的時候,也不建議對代碼進行優化,因為優化可能會使某些代碼被刪除或改寫,或者重組,從而使跟蹤和調試變得異常困難。