C代碼最佳化方案

來源:互聯網
上載者:User

C代碼最佳化方案

1、選擇合適的演算法和資料結構

2、使用盡量小的資料類型

3、減少運算的強度

(1)、查表(遊戲程式員必修課)

(2)、求餘運算

(3)、平方運算

(4)、用移位實現乘除法運算

(5)、避免不必要的整數除法

(6)、使用增量和減量操作符

(7)、使用複合賦值運算式

(8)、提取公用的子運算式

4、結構體成員的布局

(1)按資料類型的長度排序

(2)把結構體填充成最長類型長度的整倍數

(3)按資料類型的長度排序本地變數

(4)把頻繁使用的指標型參數拷貝到本地變數

5、迴圈最佳化

(1)、充分分解小的迴圈

(2)、提取公用部分

(3)、延時函數

(4)、while迴圈和do…while迴圈

(6)、迴圈展開

(6)、迴圈嵌套

(7)、Switch語句中根據發生頻率來進行case排序

(8)、將大的switch語句轉為嵌套switch語句

(9)、迴圈轉置

(10)、公用代碼塊

(11)提升迴圈的效能

(12)、選擇好的無限迴圈

6、提高CPU的並行性

(1)使用並行代碼

(2)避免沒有必要的讀寫依賴

7、迴圈不變計算

8、函數

(1)Inline函數

(2)不定義不使用的傳回值

(3)減少函數調用參數

(4)所有函數都應該有原型定義

(5)儘可能使用常量(const)

(6)把本地函式宣告為靜態(static)

9、採用遞迴

10、變數

(1)register變數

(2)、同時聲明多個變數優於單獨聲明變數

(3)、短變數名優於長變數名,應盡量使變數名短一點

(4)、在迴圈開始前聲明變數

11、使用嵌套的if結構
C代碼最佳化方案 1、選擇合適的演算法和資料結構

選擇一種合適的資料結構很重要,如果在一堆隨機存放的數中使用了大量的插入和刪除指令,那使用鏈表要快得多。數組與指標語句具有十分密切的關係,一般來說,指標比較靈活簡潔,而數組則比較直觀,容易理解。對於大部分的編譯器,使用指標比使用數組產生的程式碼更短,執行效率更高。

在許多種情況下,可以用指標運算代替數組索引,這樣做常常能產生又快又短的代碼。與數組索引相比,指標一般能使代碼速度更快,佔用空間更少。使用多維陣列時差異更明顯。下面的代碼作用是相同的,但是效率不一樣。

    數組索引               指標運算

    For(;;){                p=array

    A=array[t++];          for(;;){

                                a=*(p++);

    。。。。。           。。。。。。

    }                           }

指標方法的優點是,array的地址每次裝入地址p後,在每次迴圈中只需對p增量操作。在數組索引方法中,每次迴圈中都必鬚根據t值求數組下標的複雜運算。 2、使用盡量小的資料類型

能夠使用字元型(char)定義的變數,就不要使用整型(int)變數來定義;能夠使用整型變數定義的變數就不要用長整型(long int),能不使用浮點型(float)變數就不要使用浮點型變數。當然,在定義變數後不要超過變數的作用範圍,如果超過變數的範圍賦值,C編譯器並不報錯,但程式運行結果卻錯了,而且這樣的錯誤很難發現。

在ICCAVR中,可以在Options中設定使用printf參數,盡量使用基本型參數(%c、%d、%x、%X、%u和%s格式說明符),少用長整型參數(%ld、%lu、%lx和%lX格式說明符),至於浮點型的參數(%f)則盡量不要使用,其它C編譯器也一樣。在其它條件不變的情況下,使用%f參數,會使產生的程式碼的數量增加很多,執行速度降低。 3、減少運算的強度 (1)、查表(遊戲程式員必修課)

一個聰明的遊戲大蝦,基本上不會在自己的主迴圈裡搞什麼運算工作,絕對是先計算好了,再到迴圈裡查表。看下面的例子:

舊代碼:

    long factorial(int i)

    {

        if (i == 0)

            return 1;

        else

            return i * factorial(i - 1);

    }

新代碼:

    static long factorial_table[] =

        {1, 1, 2, 6, 24, 120, 720  /* etc */ };

    long factorial(int i)

    {

        return factorial_table[i];

    }

如果表很大,不好寫,就寫一個init函數,在迴圈外臨時產生表格。 (2)、求餘運算

    a=a%8;

可以改為:

    a=a&7;

說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調用子程式來完成,代碼長、執行速度慢。通常,只要求是求2n方的餘數,均可使用位操作的方法來代替。 (3)、平方運算

    a=pow(a, 2.0);

可以改為:

    a=a*a;

說明:在有內建硬體乘法器的單片機中(如51系列),乘法運算比求平方運算快得多,因為浮點數的求平方是通過調用子程式來實現的,在內建硬體乘法器的AVR單片機中,如ATMega163中,乘法運算只需2個刻度就可以完成。既使是在沒有內建硬體乘法器的AVR單片機中,乘法運算的子程式比平方運算的子程式碼短,執行速度快。

如果是求3次方,如:

    a=pow(a,3。0);

更改為:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.