代碼優化是指編譯器通過分析源代碼,找出其中尚未達到最優的部分,然后對其重新進行組合,目的是改善程序的執行性能。GCC提供的代碼優化功能非常強大,它通過編譯選項-On來控制優化代碼的生成,其中n是一個代表優化級別的整數,比較典型的范圍是從0變化到2或3。
編譯時使用選項-O可以告訴GCC同時減小目標代碼的長度和執行時間,其效果等價於-O1。選項-O2告訴GCC除了完成-O1級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項-O3則除了完成-O2級別的優化之外,還包括循環展開和其他一些與處理器特性相關的優化工作。通常來說,數字越大優化的等級越高,同時也意味着程序的運行速度越快。許多程序員喜歡使用-O2選項,因為它在優化長度、編譯時間和代碼大小之間取得了一個比較理想的平衡點。
下面對程序optimize.c進行代碼優化演示。
1 #include<stdio.h> 2 3 int main(void) 4 { 5 double counter; 6 double result; 7 double temp; 8 9 for(counter = 0; counter < 2000.0*2000.0*2000.0/20.0+2020; counter += (5-1)/4) 10 { 11 temp = counter / 1979; 12 result = counter; 13 } 14 15 printf("Result is %lf\n", result); 16 17 return 0; 18 }
(1) 不加任何優化選項進行編譯:
gcc -Wall optimize.c -o optimize
(2) 借助Linux提供的time命令,統計出改程序在運行時所需的時間:
time ./optimize
Result is 400002019.000000
real 0m6.261s
user 0m6.250s
sys 0m0.000s
(3) 使用優化選項來對代碼進行優化處理:
gcc -Wall -O optimize.c -o optimize
(4) 同樣條件下再測試一下運行時間:
time ./optimize
Result is 400002019.000000
real 0m1.964s
user 0m1.960s
sys 0m0.000s
對比兩次結果不難看出,程序的性能得到了很大幅度的改善,由原來的6s縮短到1s。盡管GCC代碼優化功能很強大,但還是要力求能手工編寫出高質量的代碼。如果寫的代碼簡短,並且邏輯性強,編譯器就不會做更多的工作,甚至根本不用進行優化。優化雖然能給程序帶來更好的執行性能,但在一些場合中應避免優化代碼:
- 程序開發時 優化等級越高,消耗在編譯上的時間越長,因此在開發時最好不要使用優化選項,只有到軟件發行或開發結束的時候才考慮對最終生成的代碼進行優化。
- 資源受限時 一些優化選項會增加可執行代碼的體積,如果程序在運行時能夠申請到的內存資源非常緊張(如一些實時嵌入式設備),那就不要對代碼進行優化,因為由這帶來的負面影響可能會產生非常嚴重的后果。
- 跟蹤調試時 在對代碼進行優化時,某些代碼可能會被刪除或改寫,或者為了取得更加的性能而進行重組,從而使跟蹤和調試變得異常困難。
