提高程式碼的執行效率(1)

weixin_30924079發表於2020-04-04


【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

 

    在下面的blog當中,我將會講解一些提高個人程式碼效率的一些手段。這些手段都是被實踐證明,切實可行的。但是不同的處理器和處理平臺上面可能會有所差別,但是本質上是一樣的。

 

(1) 用for(; ;) 代替while(1)

(2) 迴圈的時候首先進行內部資料的迴圈,然後進行外部資料的迴圈

(3) 同一層迴圈之內,儘量只安排同一資料的相關操作

(4) 編譯的時候標頭檔案不要相互包含,儘量簡單

(5) 儘量不要使用乘除, 多用加減和移位操作

(6) 部分複製、計算操作可以用SIMD命令代替,比如 SSE命令等等

(7) 如果是伺服器軟體或者是遊戲客戶端軟體,請多使用查詢,少計算

(8) if() ...else()的時候,把最長出現的程式碼放在前面,不經常出現的結果放在後面

(9) 使用陣列的時候,多使用int* p = &value[0]; p ++;迭代的形式, 這樣可以減少資料的計算

(10) 優化演算法,發揮當前CPU多核的優勢,最大限速地發揮CPU的特性

 

 

說明:

    以下所有程式碼都是VC6.0完成。 

 

詳解:

(1) 為什麼需要用for(; ;)代替while(1)?

 

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. 5:        int m = 0;  
  2. 00401038   mov         dword ptr [ebp-4],0  
  3. 6:  
  4. 7:        while(1)  
  5. 0040103F   mov         eax,1  
  6. 00401044   test        eax,eax  
  7. 00401046   je          test+32h (00401052)  
  8. 8:        {  
  9. 9:            if( m == 0)  
  10. 00401048   cmp         dword ptr [ebp-4],0  
  11. 0040104C   jne         test+30h (00401050)  
  12. 10:               break;  
  13. 0040104E   jmp         test+32h (00401052)  
  14. 11:       }  
  15. 00401050   jmp         test+1Fh (0040103f)  
  16. 12:  
  17. 13:       for(;;)  
  18. 14:       {  
  19. 15:           if( m == 0)  
  20. 00401052   cmp         dword ptr [ebp-4],0  
  21. 00401056   jne         test+3Ah (0040105a)  
  22. 16:               break;  
  23. 00401058   jmp         test+3Ch (0040105c)  
  24. 17:       }  
  25. 0040105A   jmp         test+32h (00401052)  
  

 

    可以很清楚地看出,while(1)被翻譯成了三個命令,而for(;;)卻沒有。很多同學可能認為,這只是三條指令而已,沒有什麼大驚小怪的,

但是我們要知道,很多迴圈都是上百萬次的進行的,如果一般的函式都注意這個問題,那麼一天節省下來的CPU時間是相當可觀的。

 

 

(2) 待續

 

轉載於:https://www.cnblogs.com/sier/archive/2011/09/21/5676476.html

相關文章