[討論] function pointer比switch和if有效率?

看板C_and_CPP作者 (Zoxge)時間7年前 (2017/05/24 00:29), 編輯推噓6(6026)
留言32則, 10人參與, 最新討論串1/1
http://fred-zone.blogspot.tw/2008/07/c-switch.html https://stackoverflow.com/questions/20906060/if-statement-vs-function-pointer 看到上面兩篇文章 分別提到function pointerc會比使用switch case和if else效能更好 小弟是覺得function pointer可以讓code變得較簡潔 但能夠達到效能更好的原因是什麼呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.228.65 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1495556948.A.486.html

05/24 00:34, , 1F
我都把這種問題交給編譯器大神
05/24 00:34, 1F

05/24 00:39, , 2F
第一個中文網頁也沒反組譯也沒測速,是自己瞎猜的吧 XDD
05/24 00:39, 2F

05/24 00:41, , 3F
還真的沒聽過,下面這個我倒是聽過
05/24 00:41, 3F

05/24 00:41, , 4F
同意一樓,最佳化交給 compiler 就好
05/24 00:41, 4F

05/24 00:42, , 5F
函數參數傳functor比傳函數指標快
05/24 00:42, 5F

05/24 00:43, , 6F
找出真正的效能瓶頸再去解決就好,不要把時間花在跑不了
05/24 00:43, 6F

05/24 00:44, , 7F
Premature optimization is the root of all evil.
05/24 00:44, 7F

05/24 00:44, , 8F
不要把時間花在最佳化一個每秒跑不到一萬次的UI小功能上
05/24 00:44, 8F

05/24 00:51, , 9F
第一個作法來說,compiler 只要頭殼沒燒壞,switch-case
05/24 00:51, 9F

05/24 00:51, , 10F
本來就是用查表法 (table access) 來實作了,而且有專用
05/24 00:51, 10F

05/24 00:52, , 11F
的 CPU instruction 來做,我不相信他這做法有比較快
05/24 00:52, 11F

05/24 00:53, , 12F
第二個做法則是因為可以製造一種情況,切換/條件判斷
05/24 00:53, 12F

05/24 00:54, , 13F
只在切換 checkbox 時做,而 loop 裡面不用再做,只需要
05/24 00:54, 13F

05/24 00:54, , 14F
無腦呼叫,理論上在常常跑 loop 而很少切換時有幫助
05/24 00:54, 14F

05/24 00:55, , 15F
但實際上省不了多少時間,反而讓程式變難讀難維護
05/24 00:55, 15F

05/24 01:16, , 16F
請仔細看 stackoverflow 的回答吧
05/24 01:16, 16F

05/24 01:17, , 17F
單層 if/switch 的情況通常都比 function pointer 快
05/24 01:17, 17F

05/24 09:40, , 18F
switch我記得compiler會建立多個label,第一次比較之後
05/24 09:40, 18F

05/24 09:41, , 19F
直接jmp,function pointer則需要push/pop的時間,不覺
05/24 09:41, 19F

05/24 09:41, , 20F
得會比較快
05/24 09:41, 20F

05/24 19:12, , 21F
https://goo.gl/qKsfwD compiler 通常滿聰明的...
05/24 19:12, 21F

05/24 20:28, , 22F
受教了,所以function pointer只是讓code變簡潔而已嗎?@@
05/24 20:28, 22F

05/24 23:07, , 23F
不,如果你只有簡短的if或switch
05/24 23:07, 23F

05/24 23:08, , 24F
改用function pointer只是讓程式看起來更難懂
05/24 23:08, 24F

05/24 23:15, , 25F
function pointer 用起來很爽, 看code很不爽
05/24 23:15, 25F

05/24 23:52, , 26F
function pointer在某些HAL相關程式很好用,例如可以根
05/24 23:52, 26F

05/24 23:52, , 27F
據不同硬體狀況接到不同的function,而上層可以無感的使
05/24 23:52, 27F

05/24 23:53, , 28F
用,或是和structure結合做成一個結構陣列表單,可以自
05/24 23:53, 28F

05/24 23:54, , 29F
動根據代入的資訊跑相對應的function
05/24 23:54, 29F

05/30 05:33, , 30F
你最初設定 function pointer 的地方一定有 if 或 switch
05/30 05:33, 30F

05/30 05:34, , 31F
,如果不用 function pointer,每個呼叫點都要放 if 或
05/30 05:34, 31F

05/30 05:34, , 32F
switch,改程式的時候就知道死。
05/30 05:34, 32F
文章代碼(AID): #1P96DKI6 (C_and_CPP)