把一堆if 判斷隔出來設為一個函式 , 這樣會跑比較快嗎?

假設我需要有一堆的if判斷,
if(){ if(){ if(){....... }}}}
大約8~20個判斷,
請問哪個執行速度會比較快呢?

1. 全部寫在主程式內

2.把判斷是抓出來 , 另設為一個函式,
待要用的時候再呼叫





小弟目前是以為1最快,
2的話只是讓程式碼好看一點而已
請大大幫忙解答....
感激不盡~~~
文章關鍵字

pccenter1204 wrote:
假設我需要有一堆的i...(恕刪)


1比較快吧
但是做法很令人傻眼
這樣弄自己也不方便閱讀不是嗎?

pccenter1204 wrote:
假設我需要有一堆的i...(恕刪)


1. 寫到主程式裡比較快

寫成函式的話Program Count要跳躍
會多出一些跟Register、Stack有關的指令

不過差異甚小 感覺不出來的

如果if裡面的condition會重複用到好幾次
考慮日後的維護性 選2是更好的方法

pccenter1204 wrote:
假設我需要有一堆的i...(恕刪)


我的認知:

把程式獨立成一個函式不會比較快。因為當成是執行到該段函式時,還必須把目前正在執行的"工作"
先儲存起來,然後轉換到執行函式內的內容。

但為了程式後續好維護,且降低程式的藕合性及提高內聚力。通常都會把獨立的程式單元獨立出去。

若有錯,請指正。
好的函式名相當於註解,而且不會有程式改了,註解卻沒改到的問題。
ex:

bool FileExist(const wchar_t* szFile)
{
return (0xFFFFFFFF != GetFileAttributes(szFile));
}

if (FileExist(L"a.txt") ...;
if (FileExist(L"b.txt") ...;


至於速度,現在慢的多是磁碟、畫圖、網路,一般的邏輯是用不了多少cpu的。
compiler的最佳化多半會將短的函式inline,多半不會影響速度。
而且現在cpu多核心,如果太慢可以另開thread多工去做。

pccenter1204 wrote:
假設我需要有一堆的i...(恕刪)


不能用 case switch 嗎?

1.2.兩種寫法,實務上速度是不會差多少的,因為副程式也是放在記憶體內,
就算是用動態連結最後也是在cache上面(扯遠了),
另外如果寫 code 的風格好的話,兩種都不會太難看。

不過話說回來有經驗的程式設計人員
通常不會讓自己陷入第1種狀況。
推前面幾位大大的,
都說的很好, 也很有道理.

主要還是要考慮易維護, 易閱讀.
因為你寫完後三個月再回來看,
你可能會搞不懂你之前再寫什麼,
甚至有註解也一樣...
如果可以用switch case就不要用if

一般不會包到好幾個if

通常包到5個if

後續維護的困難度就很精采了

判斷式如果可以整合的就整合起來吧~

不然太多會很辛苦的

xor and or not
利用位元去判斷最快
如果有 8~20 個判斷,使用 4 個位元組相當 data type long

es_mato wrote:
xor and or...(恕刪)


讓小弟想起早期電腦系統資源苦哈哈年代,
所謂的程式最佳化。

許多 C/C++ 編譯器,當你下達針對速度最佳化的參數時,
其中一個動作就是,
它會「想辦法」把這些副函式「盡可能」展開到主程式之中(對,類似 1 的情況)
從低階的角度看,少了很多 push/pop、call/jmp 的動作
速度確實會有差別,只是你有 N 個迴圈就會被展開 N 次,
同樣程式碼反覆出現的結果,最明顯的代價就是程式體積會變大。

所謂的「盡可能」就是不是所有的函式都可以來這招,
特別是有一堆變數、結構與指標丟來丟去的狀況。

而副函式的好處除了維護方便之外,另一個好處就是,
如果你的函式寫得夠好,是可以直接被重複使用的,
一堆 .lib、.dll、.ocx....裡頭就是包好的函式。

現在的軟硬體老愛搞多線程,
大量用函式撰寫的程式碼,反而有利於編譯器(如果有支援的話)分析語法結構,
來進行最佳化。

有的編譯器可以將程式碼輸出成組合語言,
樓主不妨轉看看,順便計算一下每個動作的 clock 總和...



文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!