C 編碼

C 編碼

c語言是套用的比較多的程式語言,由於它是相對較低級的語言,執行的效率高,同時還可以操作硬體,所以成了在嵌入武系統編程的首選程式語言,但是由於嵌入式系統的記憶體相對來說較小,而且嵌入式的實時性要求較高,編碼時就需要考慮性能衛要考慮記憶體受限.這就需要討論編碼的技巧對性能的影響。

基本介紹

  • 中文名:C編碼
  • 外文名:C Programing
  • 領域:計算機編程
  • 編碼語言:C語言
  • 套用:計算機系統、嵌入式編碼
  • 特點:效率高
數據結構和算法的最佳化,編碼的效率,語言結構,系統體系結構,系統庫,編譯器的最佳化,

數據結構和算法的最佳化

數據結構是為了更合理的使用計算機的記憶體。並且適台計算機的定址方式,使中央處理器更有效的定址。在CPU定址時一般使用32/64位的地址,一次防問的記憶體單元一般是四個或八十位元組.所以設計數據結構時要考慮計算機的位元組對齊.這樣可提高讀取的速度。由於平台不同,不同數據類型存儲位元組不同,結構中數據類型的排列順序不同。占有的記憶體容量就不同.所以設計數據結構時,要考慮平台的存儲分配。如比特域,既有記憶體影響,又有性能影響。記憶體影響與結構中相似,在windows平台下比特域占4位元組,台理使用這4個位元組.可以充分利用記憶體。同時變數的集中存放,可以生成速度快的代碼.
程式的高效算法可以說是軟體效率的必要條件。但它不是性能的必要條件.性能是幾個必要因素的綜合結果。

編碼的效率

語言結構

每個語言在其中增加了功能和靈活性。這些優點不是無償的。指針是 c 語言中的一個特色,功能強大,但也是出錯的根源。它雖然很靈活,可以操作記憶體,但是由於本身沒有對指針進行邊界檢測,所以常導致緩衝區溢出的漏洞, 但指針的效率是比較高的。在訪問數組時, 指針訪問速度比直接用數組下標要快,因為數組訪問時每次計算下標後從數組頭開始訪問數組元素,而指針可以根據數據類型直接定位到元素,但有的編譯器中數組就比指針快。C 語言中的數字既有無符號也有有符號的,它們可以由編譯器作默認的轉變,同時不同的數字數據類型之間也是不加提示的提升和截斷,這也是出現漏洞和產生錯誤的根源,在最佳化時也明確地指明數據類型的轉化,既增加了可讀性也減少了出錯的幾率。所以要根據實際的需要來使用數據類型,不要使用過長的數據類型,增加不必要的計算周期,尤其在能使用整數時不要使用浮點數。在作乘除或求余時, 可以轉化為位運算。還有 + = ,++運算符,雖然+=和一般的加法賦值結果一樣, 但是 + = 運算少了一次的讀操作。+ +有前綴和後綴之分,但是前綴 ++ 操作少了臨時變數的生成, 效率上也高。

系統體系結構

系統體系結構是指影響性能的受計算機硬體結構限制的,包括記憶體容量的限制,存儲開銷不均衡以及在普通的計算機上並不能實現真正的並行。CPU 都採用流水線指令處理且存儲開銷的不平衡,所以循環展開和利用快取是提高性能的關鍵。
循環展開和多路就是充分利用系統的體系結構來提高性能的,尤其在數組存取上,當在循環中存取一維數組時或作數組的運算時,在每次循環中,把邏輯上獨立的數組的運算分成多次,既利用了CPU 的流水線指令處理特徵,提高了並行性,又減少了循環次數。不過由於CPU的暫存器數量的限制,循環多路最多四次,如果次數過多,反而性能下降,因為暫存器不足以存放循環中的值,需要放到棧中,這樣就降低了性能,即所謂的暫存器溢出。
快取是另外的一種提高性能的方式,在多維數組的存取時,既要考慮平台存儲多維數組的方式,又要考慮程式的局部性,防止快取每次存取的不命中。

系統庫

在設計系統庫時,通常運用靈活性和通用性的思想,但是靈活性和通用性以及性能之間存在一個平衡.所以說庫在某些情況下也並不是最最佳化的。例如標準庫性能很高效的,由於其通用性,在某些情況下,沒有充分利用條件參數,導致程式邏輯的執行很多是無用的,效率上也不是最好的,這時用自己的函式來替代系統庫使效率最優。再者由於庫函式對系統的資源分配和程式的安全性等要求也不一樣,程式的效率也不相同。如函式puts()就比其他的輸出函式要快。一些系統庫提供的容器,它們使用不同的數據結構來分配空間,效率也相差很大。還有一些檔案讀取函式,因為使用的讀取塊大小不同以及使用不使用緩衝而有很大的效率差別。

編譯器的最佳化

編譯器的最佳化包括循環的展開,把常量表達式放到循環之外以及消除多餘計算的技術。大多數的編譯器會完成這樣的最佳化。但不要指望任何特定的編譯器完成特定的最佳化。有的編譯器循環展開 2 次,而有的展開 4次, 還有一些根本不展開。為了最終控制權必須把編碼問題掌握在自己手中。

相關詞條

熱門詞條

聯絡我們