GCC編譯器代碼優化

  代碼優化是指編譯器經過分析源代碼,找出其中還沒有達到最優的部分,而後對其從新進行組合,目的是改善程序的執行性能。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 optimizespa

(2) 藉助Linux提供的time命令,統計出改程序在運行時所需的時間:調試

time ./optimizecode

Result is 400002019.000000blog

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代碼優化功能很強大,但仍是要力求能手工編寫出高質量的代碼。若是寫的代碼簡短,而且邏輯性強,編譯器就不會作更多的工做,甚至根本不用進行優化。優化雖然能給程序帶來更好的執行性能,但在一些場合中應避免優化代碼:

  • 程序開發時    優化等級越高,消耗在編譯上的時間越長,所以在開發時最好不要使用優化選項,只有到軟件發行或開發結束的時候才考慮對最終生成的代碼進行優化。
  • 資源受限時    一些優化選項會增長可執行代碼的體積,若是程序在運行時可以申請到的內存資源很是緊張(如一些實時嵌入式設備),那就不要對代碼進行優化,由於由這帶來的負面影響可能會產生很是嚴重的後果。
  • 跟蹤調試時    在對代碼進行優化時,某些代碼可能會被刪除或改寫,或者爲了取得更加的性能而進行重組,從而使跟蹤和調試變得異常困難。  
相關文章
相關標籤/搜索