這篇文章主要介紹“怎么優化void程序的性能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么優化void程序的性能”文章能幫助大家解決問題。
創新互聯建站是一家集網站建設,巍山企業網站建設,巍山品牌網站建設,網站定制,巍山網站建設報價,網絡營銷,網絡優化,巍山網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。我們的編譯器已經提供了很好的優化機制,但是還有很多細節編譯器優化不到,或者說沒膽量去優化,因為有一些激進的優化很有可能會違背程序員的初心。
// 第一種
void twiddle1(long *xp, long *yp){
*xp += *yp;
*xp += *yp;
}
// 第二種
void twiddle2(long *xp, long *yp){
*xp += 2* *yp;
}
例如上面的程序,看到第一種寫法,我們可能很容易的就想到第二種寫法,但是編譯器卻不會把它變成這種寫法。乍看它們沒什么區別,我們來分析一下內存引用。第一種需要 3 次內存引用,即讀\*xp、讀\*yp、寫\*xp
;而第二種卻需要 6 次內存引用,即2 次讀\*xp、2 次讀\*yp、2 次寫\*xp
。所以第一種的性能要比第二種好。
那編譯器看到第一種為什么就想不到第二種寫法呢?這不是很簡單的規則嗎?實際上上面的程序存在xp = yp
的情況,即兩個指針指向同一個內存位置。
// 第一種
*xp += *yp; // xp 處存放的值乘以 2
*xp += *yp; // xp 處存放的值乘以 2
// 第二種
*xp += 2* *yp; // xp 處存放的值乘以 3
可以看到,當它們都指向同一塊內存時,第一種寫法會讓原來的值增加 4 倍,而第二種寫法會讓原來的值增加 3 倍,產生了不同的效果,而編譯器會當這種情況可能出現,所以編譯器并不會幫我們優化第一種代碼,這需要程序員自己去維護。
相信很多人都寫過下面類似的代碼,貌似沒有什么可以優化的,寫的挺好。
void lower1(char *s){
long i;
for(i = 0; i < strlen(s); i++){
if(s[i] >= 'A' && s[i] <= 'Z'){
s[i] -= ('A' - 'a');
}
}
}
仔細看,會發現每次循環都會去調用strlen()
函數,而這個函數明顯是要拖累性能的,實際上我們只需要計算一次長度就可以了,現在卻每次循環都需要去計算一次長度,所以可以將計算移到前面只計算一次的地方。
void lower2(char *s){
long i;
long len = strlen(s);
for(i = 0; i < len; i++){
if(s[i] >= 'A' && s[i] <= 'Z'){
s[i] -= ('A' - 'a');
}
}
}
編譯器雖然會試著去進行代碼的移動,但是最終還是沒有優化,是因為改變在哪里調用函數或者調用多少次函數的變換,編譯器并不能比較可靠的發現一個函數是否有副作用,比如下面的情況。
long f();
long func1(){
return f() + f() + f() + f();
}
long func2(){
return 4*f();
}
這段代碼和開篇提到的代碼在形式上很像,可能你會說:它們不會指到同一塊內存了呀,編譯器這也不去優化嗎?考慮一下f()
是下面的形式。
long count = 0;
long f(){
return count++;
}
是不是一下就發現問題了,func1()
調用 4 次f()
,而func2()
只調用 1 次f()
,它們最終的結果絕不是簡單的 4 倍關系。
如果編譯器能夠產生使用條件數據傳送
而不是條件控制轉移
的代碼,那么就可以大大的提高程序的性能,關于條件數據傳送和條件控制轉移在舊文順序、條件、循環語句的底層解釋中描述的已經很明確了。比如下面的第一種寫法就比第二種要好。
// 第一種
void minmax1(long a[], long b[], long n){
long i;
for(i = 0; i < n; i++){
if(a[i] > b[i]){
long t = a[i];
a[i] = b[i];
b[i] = t;
}
}
}
// 第二種
void minmax2(long a[], long b[], long n){
long i;
for(i = 0; i < n; i++){
long min = a[i] < b[i] ? a[i] : b[i];
long max = a[i] < b[i] ? b[i] : a[i];
a[i] = min;
b[i] = max;
}
}
關于“怎么優化void程序的性能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注創新互聯-成都網站建設公司行業資訊頻道,小編每天都會為大家更新不同的知識點。
網站名稱:怎么優化void程序的性能-創新互聯
分享網址:http://m.newbst.com/article16/dcgjdg.html
成都網站建設公司_創新互聯,為您提供網站維護、ChatGPT、企業建站、網站策劃、搜索引擎優化、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯