說明:本文示例摘自《深入理解計算機系統》第五章----優化程式效能。
在程式優化時,對於這樣一種現象不得不注意,即儲存器別名使用。
那麼什麼是儲存器別名使用呢?
簡單來說,就是「兩個指標可能同時指向同乙個儲存位址的情況」。
示例為證,考慮下面的**序列:
x = 1000;
y = 3000;
*q = y;
*p = x;
t1 = *q;
最終t1是多少呢?可能很多人會不假思索就回答3000,然而事實上它是完全有可能等於1000的,這種情況取決於指標p和q是否指向同乙個位址,即p是否等於q。
再來看另乙個例子:
void twiddle1(int *xp, int *yp)
void twiddle2(int *xp, int *yp)
乍一看,這兩個函式似乎相同,其實不然,同樣的道理,這樣認為的人還是忽視了儲存器別名使用的情況,但xp與yp都指向同一片記憶體時,差異就顯示出來了,前者中xp的值會增加4倍,而後者卻只增加3倍!
這樣的例子還有很多,比如遇到全域性變數時,如下例:
int f();
int func1()
int func2()
此時又如何呢?它們一定會返回同樣的結果嗎?非也!比如出現這樣的情況:
int counter = 0;
int f()
注意此時在func1中f()呼叫了4次,最終結果為 0+1+2+3= 6, 而func2中卻只呼叫了1次,最終結果為4*0=0!!!
很神奇,不是嗎?!所以在優化程式時,知道該注意什麼了吧?
儲存器別名使用!請深深將其烙印在你腦海中!
儲存器層次結構 基於儲存器的程式優化
乙個編寫良好的電腦程式常常具有良好的區域性性,它們傾向於引用鄰近於其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。區域性性通常有兩種不同的形式 下面來看個區域性性的 示例 變數sum在每此迴圈中被引用一次,因此具有良好的時間區域性性。變數v的元素被順序讀取,具有良好的空間區域性性。像這種...
mysql之優化 儲存引擎
1.2 myisam 與 innodb 主要區別 1.3 如何選擇mysql的儲存引擎 目前廣泛使用的是myisam和innodb兩種引擎 1.1.1 myisam myisam引擎是mysql 5.1及之前版本的預設引擎,它的特點是 1.1.2 innodb innodb在mysql 5.5後成為...
MySQL 儲存程式之儲存過程
1.儲存引擎簡介是mysql的核心,一組軟體包括快取軟體,語法語義分析,解析的軟體等,不同的儲存引擎提供不同的儲存機制,索引技巧,鎖定水平等功能。可以根據不同的功能來設定不同的儲存引擎。innodb 事務性資料庫的首選,執行安全性資料庫,行鎖定和外來鍵。顯示支援的儲存引擎 show engines ...