1. 程式人生 > >【優化程式效能】編譯器的優化和限制

【優化程式效能】編譯器的優化和限制

寫程式最主要的目標是使他在所有的可能的情況下都能正確工作。程式應該寫出清晰簡單的程式碼,主要為了給後期維護,起作用;但常常我們在程式的簡單性,維護性,與程式的執行速度進行權衡;

高效的程式需要幾類活動:

(1)必須選擇一組合適的演算法和資料結構;

(2)必須編寫出編譯器能夠優化以轉換成高效可執行的原始碼,因此理解優化編譯器的能力和侷限性很重要,因此程式即使是很小的變動,會引起編譯器優化方式很大的變化;因此程式設計師經常能夠使編譯器更容易產生高效程式碼的方式來編寫他們的程式,對於C語言的指標,就編譯器已經很難優化了;

(3)併發程式設計,利用多處理器和多核的某種組合並行的計算;

現代編譯器使用複雜精細的演算法來確定一個程式中計算的是什麼值,以及它們是如何使用的,然後利用一些機會來簡化表示式,在幾個不同的地方使用用一個計算,降低給定計算的執行次數;GCC編譯器提供優化級別的控制,級別越高,程式的規模可能會提高,除錯困難會提高;低級別的優化高效的C程式碼,要比高級別的優化初級的C程式碼效能要高;

要是編譯器安全的優化,程式設計師必須花大力氣編寫編譯器可以轉換成有效的程式碼,舉例如下:

(1)*x += * y; 

          *x += *y;

與(2)*x += 2 * *y;

這兩個程式碼片段似乎有相同的行為;(2)要快一點,涉及3次儲存器引用,而(1)涉及6次儲存器引用,但是如果考慮*x = *y,則(1)會增加4倍的值,而(2)是增加3倍的值,此差別造成編譯器對這兩個片段的優化是不同的,在進行安全的優化時,編譯器會假設兩個指標指向同一個位置;

大多數的編譯器不會試圖判斷一個函式是否有副作用,會優化可能的候選函式,成為(2)的例子,因此可能造成值得不同,如下:

(1)return f()+f()

(2)return 2 * f()

f(){

  reurn counter++;

}

注意,GCC完成最基本的優化,因此需要花費更多的精力,以一種簡化編譯器生成高效程式碼的任務方式來編寫程式。