怎么優(yōu)化void程序的性能-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),巍山企業(yè)網(wǎng)站建設(shè),巍山品牌網(wǎng)站建設(shè),網(wǎng)站定制,巍山網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,巍山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

我們的編譯器已經(jīng)提供了很好的優(yōu)化機制,但是還有很多細(xì)節(jié)編譯器優(yōu)化不到,或者說沒膽量去優(yōu)化,因為有一些激進的優(yōu)化很有可能會違背程序員的初心。

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

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

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

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

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

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

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

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

相信很多人都寫過下面類似的代碼,貌似沒有什么可以優(yōu)化的,寫的挺好。

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ì)看,會發(fā)現(xiàn)每次循環(huán)都會去調(diào)用strlen()函數(shù),而這個函數(shù)明顯是要拖累性能的,實際上我們只需要計算一次長度就可以了,現(xiàn)在卻每次循環(huán)都需要去計算一次長度,所以可以將計算移到前面只計算一次的地方。

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');
        }
    }
}

編譯器雖然會試著去進行代碼的移動,但是最終還是沒有優(yōu)化,是因為改變在哪里調(diào)用函數(shù)或者調(diào)用多少次函數(shù)的變換,編譯器并不能比較可靠的發(fā)現(xiàn)一個函數(shù)是否有副作用,比如下面的情況。

long f();

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

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

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

long count = 0;

long f(){
    return count++;
}

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

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

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

// 第一種
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)的知識,可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

網(wǎng)站名稱:怎么優(yōu)化void程序的性能-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://muchs.cn/article16/dcgjdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、ChatGPT、企業(yè)建站、網(wǎng)站策劃、搜索引擎優(yōu)化、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)