妨礙優化的因素

2021-09-13 17:41:02 字數 1044 閱讀 9226

今天在看《深入理解計算機系統》時看到了效能優化,認識到了之前從未考慮過的問題。

妨礙優化的因素:

1.計算依賴的指標p和q 是否指向儲存器中同乙個位置

2.函式呼叫

舉例說明:

1)

void twiddle1(int *xp,int *yp)

void twiddle2(int *xp,int *yp)

乍一看,這兩個過程似乎有相同的行為,他們都是將儲存在由指標yp 指示的位置處的兩次加到指標xp指示的位置處的值。另一方面,函式twiddle2函式效率更高一些。它只要求3次儲存器引用(讀*xp,讀*yp,寫*xp)而twiddle1需要6次(2次讀*xp,2次讀*yp,2次寫*xp)。因此,如果要編譯器編譯過程twiddle1,我們會認為基於twiddle2執行的計算能產生更有效的**。

不過,考慮xp等於yp的情況,此時,函式twiddle1會執行下面的計算:

*xp += *xp;

*xp += *xp;

結果是xp的值會增加4倍。另一方面,函式twiddle2會執行下面的計算:

*xp += 2 * *xp;
結果是xp的值會增加3倍。編譯器不知道twiddle1會如何被呼叫,因此它必須假設引數xp 和yp可能會相等。因此,它不能產生twiddle2風格的**作為twiddle1的優化版本。

2)

int f();

int func1()

int func2()

最初看上去兩個過程計算的都是相同的結果,但是func2只呼叫了f 1次,而func1呼叫了4次。以func1作為源時,會很想產生func2風格的**,不過,考慮下面f的**;

int counter=0;

int f()

這個函式有個***,它修改了全域性程式狀態的一部分。改變了呼叫它的次數會改變程式的行為。特別的,假設開始時全域性變數counter 都設定為0,對 func1的呼叫會返回 0+1+2+3=6 ,而func2的呼叫會返回4*0=0.

妨礙編譯器優化的因素

編譯器會對程式進行優化,這種優化是安全的優化,即對於所有可能的情況,優化後的程式和未優化的程式具有相同的行為。兩種因素會妨礙編譯器對程式的優化。1.儲存器別名使用 void twiddle1 int xp,int yp void twiddle2 int xp,int yp 函式twiddle1需要...

Mysql效能優化需要考慮的因素

對於程式設計師來說資料庫就是操作非常方便的資料儲存中心,希望什麼資料都存放在資料庫中,不論是需要持久化的資料,還是臨時存放的過程資料,不論是普通的純文字格式的字元資料,還是多 的二進位制資料,都喜歡全部塞如資料庫中。因為對於應用伺服器來說,資料庫很多時候都是一集中式的儲存環境,不像應用伺服器那樣可能...

seo優化應該重要哪些因素?

演算法的不斷更新,帶給不少站長很多迷茫,那麼在seo優化當中,站長應該注意那幾個方面呢?1 心態 許多企業希望 優化能在短時間內看到效果,也在無形中給seoer壓力,導致它們容易浮躁 操之過急。企業如果想走 優化這條路,就要有打持久戰的準備。對於seoer來說,良好的心理素質必不可少。作弊手段只會讓...