[問題] 多次呼叫函數pow的效能問題

看板C_and_CPP (C/C++)作者 (肥天笨熊)時間16年前 (2010/03/26 00:01), 編輯推噓13(13019)
留言32則, 9人參與, 最新討論串1/1
若在雙層迴圈裡面要用到pow這種開多次方函數,但我以開2次方做測試 發現在多次呼叫pow函數與直接在迴圈內做變數的連乘的動作的效能 相差甚大@@大概差了快要10倍時間,所以想請問呼叫一個函數所造成的 延遲真的有差到那麼多嗎?謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.194.223.61

03/26 00:04, , 1F
建議貼程式碼與測試的結果上來 大家一起討論 :)
03/26 00:04, 1F

03/26 00:06, , 2F
看不懂你的描述, 你是指pow(x,2)與x*x的差別嗎??
03/26 00:06, 2F

03/26 00:06, , 3F
是的話, 那是正常的, 問題不只在函數呼叫而已....
03/26 00:06, 3F

03/26 00:07, , 4F
而是pow()是用數值方法逼近的, 被後計算多到爆....XD
03/26 00:07, 4F

03/26 00:11, , 5F
原來如此,難怪會那麼慢@@感謝阿
03/26 00:11, 5F

03/26 00:15, , 6F
如果有修到數值方法之類的課, 就有機會讓你自己用許多
03/26 00:15, 6F

03/26 00:16, , 7F
數學方法來求math.h裡的常見函數, 如sqrt/pow/sin/tan
03/26 00:16, 7F

03/26 00:16, , 8F
這些等等; 又, x如過是整數, 代入pow這種以浮點數來計算
03/26 00:16, 8F

03/26 00:17, , 9F
的函數求值的話, 速度也會有差; 甚至以後要用這些數學函
03/26 00:17, 9F

03/26 00:18, , 10F
數但不需要這麼高的精確度的話, 也有機會自己寫的:)
03/26 00:18, 10F

03/26 00:20, , 11F
所以說如果沒必要的話在大量計算中就不要塞pow進去嗎?
03/26 00:20, 11F

03/26 00:21, , 12F
沒必要就別浮點, 能自己乘就別pow, 能sqrt就別pow, 不需
03/26 00:21, 12F

03/26 00:22, , 13F
要太高的精確度時也可以考慮自己實作pow()來用....@_@"
03/26 00:22, 13F

03/26 00:25, , 14F
恩恩,多上了一個課,感謝你阿
03/26 00:25, 14F

03/26 00:39, , 15F
原來如此,感恩+1
03/26 00:39, 15F

03/26 00:47, , 16F
其實我本來也想說能float就不要double的, 可是不知道為
03/26 00:47, 16F

03/26 00:48, , 17F
什麼, 測試程式裡代float竟然比double還要慢, 詭異Orz
03/26 00:48, 17F

03/26 02:09, , 18F
原來是這樣...感恩
03/26 02:09, 18F

03/26 11:10, , 19F
float 和 double 都是同一顆 FPU 在做運算的
03/26 11:10, 19F

03/26 11:11, , 20F
小弟有推想過, Intel實際上會用80bit的FPU來做運算, 大
03/26 11:11, 20F

03/26 11:12, , 21F
概在它to float的轉換上反而更花時間; 好比以前有看過某
03/26 11:12, 21F

03/26 11:13, , 22F
好像unsigned type轉浮點意外的比int轉浮點還久(指令加
03/26 11:13, 22F

03/26 11:14, , 23F
速的差異??); 不過非近期最新的GPU上, 就真的能用float
03/26 11:14, 23F

03/26 11:14, , 24F
就別double了....XD
03/26 11:14, 24F

03/26 11:27, , 25F
80bit FPU 的時代也快結束了 現在都嘛用 SSE
03/26 11:27, 25F

03/26 11:35, , 26F
@@
03/26 11:35, 26F

03/26 13:14, , 27F
其實就算差個十倍 程式仍然在一瞬間跑完 現在電腦很快
03/26 13:14, 27F

03/26 13:15, , 28F
除非程式會跑很久 或很在意效率 才需要減少這類函式呼叫
03/26 13:15, 28F

03/26 13:16, , 29F
記得有書上寫 現在的電腦用float普都較慢 因為背後的計算
03/26 13:16, 29F

03/26 13:16, , 30F
很可能是轉成double來算 反而多了轉換時間 所以除非記憶體
03/26 13:16, 30F

03/26 13:17, , 31F
受限 不然沒必要用float
03/26 13:17, 31F

03/27 01:58, , 32F
之前寫影像處理的程式也是有pow跑5分鐘 拿掉變十幾秒
03/27 01:58, 32F
文章代碼(AID): #1BguY-qc (C_and_CPP)
文章代碼(AID): #1BguY-qc (C_and_CPP)