久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么優(yōu)化void程序的性能

共計(jì) 1935 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

這篇文章主要介紹“怎么優(yōu)化 void 程序的性能”的相關(guān)知識(shí),丸趣 TV 小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“怎么優(yōu)化 void 程序的性能”文章能幫助大家解決問(wèn)題。

我們的編譯器已經(jīng)提供了很好的優(yōu)化機(jī)制,但是還有很多細(xì)節(jié)編譯器優(yōu)化不到,或者說(shuō)沒(méi)膽量去優(yōu)化,因?yàn)橛幸恍┘みM(jìn)的優(yōu)化很有可能會(huì)違背程序員的初心。

//  第一種 
void twiddle1(long *xp, long *yp){
 *xp += *yp;
 *xp += *yp;
}

//  第二種
void twiddle2(long *xp, long *yp){
 *xp += 2* *yp;
}

例如上面的程序,看到第一種寫(xiě)法,我們可能很容易的就想到第二種寫(xiě)法,但是編譯器卻不會(huì)把它變成這種寫(xiě)法。乍看它們沒(méi)什么區(qū)別,我們來(lái)分析一下內(nèi)存引用。第一種需要 3 次內(nèi)存引用,即讀 \*xp、讀 \*yp、寫(xiě) \*xp;而第二種卻需要 6 次內(nèi)存引用,即 2 次讀 \*xp、2 次讀 \*yp、2 次寫(xiě) \*xp。所以第一種的性能要比第二種好。

那編譯器看到第一種為什么就想不到第二種寫(xiě)法呢?這不是很簡(jiǎn)單的規(guī)則嗎?實(shí)際上上面的程序存在 xp = yp 的情況,即兩個(gè)指針指向同一個(gè)內(nèi)存位置。

//  第一種 
*xp += *yp; // xp  處存放的值乘以  2
*xp += *yp; // xp  處存放的值乘以  2

//  第二種
*xp += 2* *yp; // xp  處存放的值乘以  3

可以看到,當(dāng)它們都指向同一塊內(nèi)存時(shí),第一種寫(xiě)法會(huì)讓原來(lái)的值增加 4 倍,而第二種寫(xiě)法會(huì)讓原來(lái)的值增加 3 倍,產(chǎn)生了不同的效果,而編譯器會(huì)當(dāng)這種情況可能出現(xiàn),所以編譯器并不會(huì)幫我們優(yōu)化第一種代碼,這需要程序員自己去維護(hù)。

消除循環(huán)的低效率

相信很多人都寫(xiě)過(guò)下面類(lèi)似的代碼,貌似沒(méi)有什么可以優(yōu)化的,寫(xiě)的挺好。

void lower1(char *s){
 long i;
 for(i = 0; i   strlen(s); i++){
 if(s[i]  =  A    s[i]  =  Z ){
 s[i] -= (A  -  a
 }
 }
}

仔細(xì)看,會(huì)發(fā)現(xiàn)每次循環(huán)都會(huì)去調(diào)用 strlen() 函數(shù),而這個(gè)函數(shù)明顯是要拖累性能的,實(shí)際上我們只需要計(jì)算一次長(zhǎng)度就可以了,現(xiàn)在卻每次循環(huán)都需要去計(jì)算一次長(zhǎng)度,所以可以將計(jì)算移到前面只計(jì)算一次的地方。

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
 }
 }
}

編譯器雖然會(huì)試著去進(jìn)行代碼的移動(dòng),但是最終還是沒(méi)有優(yōu)化,是因?yàn)楦淖冊(cè)谀睦镎{(diào)用函數(shù)或者調(diào)用多少次函數(shù)的變換,編譯器并不能比較可靠的發(fā)現(xiàn)一個(gè)函數(shù)是否有副作用,比如下面的情況。

long f();

long func1(){
 return f() + f() + f() + f();
}

long func2(){
 return 4*f();
}

這段代碼和開(kāi)篇提到的代碼在形式上很像,可能你會(huì)說(shuō):它們不會(huì)指到同一塊內(nèi)存了呀,編譯器這也不去優(yōu)化嗎?考慮一下 f() 是下面的形式。

long count = 0;

long f(){
 return count++;
}

是不是一下就發(fā)現(xiàn)問(wèn)題了,func1() 調(diào)用 4 次 f(),而 func2() 只調(diào)用 1 次 f(),它們最終的結(jié)果絕不是簡(jiǎn)單的 4 倍關(guān)系。

編寫(xiě)適合條件傳送實(shí)現(xiàn)的代碼

如果編譯器能夠產(chǎn)生使用條件數(shù)據(jù)傳送而不是條件控制轉(zhuǎn)移的代碼,那么就可以大大的提高程序的性能,關(guān)于條件數(shù)據(jù)傳送和條件控制轉(zhuǎn)移在舊文順序、條件、循環(huán)語(yǔ)句的底層解釋中描述的已經(jīng)很明確了。比如下面的第一種寫(xiě)法就比第二種要好。

//  第一種 
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;
 }
}

關(guān)于“怎么優(yōu)化 void 程序的性能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注丸趣 TV 行業(yè)資訊頻道,丸趣 TV 小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計(jì)1935字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 凤台县| 富锦市| 巴彦县| 昭苏县| 香格里拉县| 绥阳县| 临沧市| 家居| 额尔古纳市| 秦安县| 永登县| 新龙县| 广德县| 文水县| 金沙县| 平安县| 寻乌县| 迁西县| 新蔡县| 长兴县| 伽师县| 阿拉善右旗| 保亭| 和顺县| 凤凰县| 峨眉山市| 界首市| 四会市| 宣汉县| 天水市| 伊吾县| 紫阳县| 石景山区| 大石桥市| 拜泉县| 乌鲁木齐市| 当雄县| 大庆市| 宝鸡市| 建德市| 黔西县|