【 宣告:版權所有,歡迎轉載,請勿用於商業用途。 聯絡信箱: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)?
- 5: int m = 0;
- 00401038 mov dword ptr [ebp-4],0
- 6:
- 7: while(1)
- 0040103F mov eax,1
- 00401044 test eax,eax
- 00401046 je test+32h (00401052)
- 8: {
- 9: if( m == 0)
- 00401048 cmp dword ptr [ebp-4],0
- 0040104C jne test+30h (00401050)
- 10: break;
- 0040104E jmp test+32h (00401052)
- 11: }
- 00401050 jmp test+1Fh (0040103f)
- 12:
- 13: for(;;)
- 14: {
- 15: if( m == 0)
- 00401052 cmp dword ptr [ebp-4],0
- 00401056 jne test+3Ah (0040105a)
- 16: break;
- 00401058 jmp test+3Ch (0040105c)
- 17: }
- 0040105A jmp test+32h (00401052)
可以很清楚地看出,while(1)被翻譯成了三個命令,而for(;;)卻沒有。很多同學可能認為,這只是三條指令而已,沒有什麼大驚小怪的,
但是我們要知道,很多迴圈都是上百萬次的進行的,如果一般的函式都注意這個問題,那麼一天節省下來的CPU時間是相當可觀的。
(2) 待續