[問題] const array 放function內會拖慢執行速度

看板C_and_CPP作者時間8年前 (2017/02/23 14:26), 8年前編輯推噓11(11026)
留言37則, 11人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC2013 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) inline double table(int idx){ const double table1[50] = {.............}; const double table2[50] = {.............}; if (idx >= 0) return table1[idx1]; else return table1[idx2]; } 原本只是希望用一個簡單function,自動把2個table相連 沒想到跑很慢,檢查之後發現是這個function拖速度 把table1和table2拉出來當global const array,速度就提升許多 (少一半執行時間) 想知道原因 我的想像是說 const array是不會動的,會當成程式碼放在一起,並不實際另外要一段空間 進入function後只是去把值讀出來 不過不太清楚 const array放function內 和 當global variable差別 原本只是認為差在有效範圍,看執行時間貌似放在function內有資料複製的時間???? 想請問正確的觀念 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1487831163.A.A90.html

02/23 14:31, , 1F
inline拿掉,或variable改static
02/23 14:31, 1F
inline有沒有拿掉感覺影響不大 在VC2013下 debug mode : 有inline比沒有慢2~3% (感覺就誤差範圍內) relase mode : 有inline比沒有快5% 但是const array有沒有拉出去 debug mode : 拉出去比沒拉快2.42倍 release mode : 拉出去比沒拉快2.75倍 感覺不像是inline在作怪 ※ 編輯: ofd168 (60.250.205.229), 02/23/2017 14:44:41

02/23 15:31, , 2F
唔 我以為這種const array會在編譯期就做掉
02/23 15:31, 2F

02/23 15:32, , 3F
不然可以用constexpr試試看
02/23 15:32, 3F
難過了 vc2013不支援 constexpr ※ 編輯: ofd168 (60.250.205.229), 02/23/2017 16:06:56

02/23 16:09, , 4F
讓那兩個陣列變static
02/23 16:09, 4F

02/23 16:31, , 5F
變慢的原因,是建構的過程吧?宣告陣列的時候要記憶體
02/23 16:31, 5F

02/23 16:31, , 6F
規劃
02/23 16:31, 6F
在function內加上static的確速度就回來了 我以為寫const,呼叫function不會另外要記憶體 這樣不就有沒有const都會差不多@@? 這樣是說,只要const array前面都要加上static以增加速度@@? 一般一個值的const也需要加嗎?

02/23 16:57, , 7F
你這個 function 被執行幾次?
02/23 16:57, 7F
基本上超級多次,應該是其他funtion的數十倍以上 ※ 編輯: ofd168 (60.250.205.229), 02/23/2017 18:35:31 剛剛改了其他function,把所有const array加上static 速度好像沒差 看來是呼叫的次數不夠多次? ※ 編輯: ofd168 (60.250.205.229), 02/23/2017 18:46:33

02/23 18:45, , 8F
試問 table()中, 寫一句 *((double *)table1) = *table1 + 1;
02/23 18:45, 8F

02/23 18:46, , 9F
可不可以? 若可以, 呼叫 table() 十次後, *table1 會是多少?
02/23 18:46, 9F

02/23 18:47, , 10F
試試看寫在 function 內和 function 外的差別.
02/23 18:47, 10F

02/23 18:54, , 11F
上一句是指 const array.
02/23 18:54, 11F
table1[0]會比原本多1 看起來的確是每次進去都會要一塊空間,把值複製進去......

02/23 18:58, , 12F
const array 加上 static 也可以再試試看.
02/23 18:58, 12F
寫入會發生違規

02/23 19:01, , 13F
non-variable放在stack, static variable跟global放在同區
02/23 19:01, 13F

02/23 19:02, , 14F
所以每進function一次,就建立一次array然後再消滅
02/23 19:02, 14F
看起來的確是 所以寫const只不過是告訴compiler不可以更改,可是實際上行為跟一般array一樣 都是需要要空間 -> initialize........ 天啊,我一直以為他是當成程式碼放在一起耶...... (不知道哪裡來的觀念) 另外,想問是否該加上inline/改成macro呢? ※ 編輯: ofd168 (60.250.205.229), 02/23/2017 19:14:59

02/23 21:07, , 15F
inline建議complier展開省去branch, macro是compiler在
02/23 21:07, 15F

02/23 21:07, , 16F
front end階段去替換內容
02/23 21:07, 16F

02/23 21:10, , 17F
不太清楚你想要做甚麼
02/23 21:10, 17F
單純想說這個程式碼超級短,基本上就把兩個ARRAY串起來,用inline或macro會不會比較快XDDD 畢竟這個function會被呼叫超多次 ※ 編輯: ofd168 (123.195.57.89), 02/23/2017 22:45:12

02/24 01:14, , 18F
macro不影響,macro只是在compile code前就字替換掉
02/24 01:14, 18F

02/24 01:15, , 19F
但是inline要看compiler是否打算把code展開省去jump
02/24 01:15, 19F

02/24 01:24, , 20F
我覺得既然是const array就直接合併,對index操作就好啦
02/24 01:24, 20F

02/25 02:04, , 21F
用 nm 看 symbol table, 你就會知道差異在哪了
02/25 02:04, 21F

02/25 14:23, , 22F
真沒試過用 nm 看 VC2013 編譯出來的程式... 可行嗎?
02/25 14:23, 22F

02/26 04:21, , 23F
可能不行,不過 ms 上也有類似的 dumpbin.exe
02/26 04:21, 23F

02/26 23:26, , 24F
我覺得你只是單純踩到 VC++ 的 bug 了 XDDD
02/26 23:26, 24F

02/26 23:27, , 25F
http://wp.me/p1fTCO-D8 雖然是不同的狀況, 但這也是加
02/26 23:27, 25F

02/26 23:27, , 26F
了 const 反而會讓 VC++ 做錯事的例子
02/26 23:27, 26F

02/27 06:33, , 27F
那個微軟 bug tracker 裡回文的 Geoff 的論點簡直奇文共賞
02/27 06:33, 27F

02/27 06:35, , 28F
compiler 也是程式, 做錯事就得修, 哪有一定要繞過的道理..
02/27 06:35, 28F

02/27 06:36, , 29F
移掉三個 const 可以省掉 900K 程式各種意味上都是神奇
02/27 06:36, 29F

02/27 06:39, , 30F
在function外面寫array 指標傳進去加const也可以呀 要
02/27 06:39, 30F

02/27 06:39, , 31F
考慮速度的話重複執行很多次的部分盡量不要包含memory
02/27 06:39, 31F

02/27 06:39, , 32F
allocation deallocation 你可以寫一個迴圈 new delet
02/27 06:39, 32F

02/27 06:39, , 33F
e 很多次抓個時間就知道了
02/27 06:39, 33F

02/28 00:17, , 34F
@uranusjr 原po的不能算是bug,根據 goo.gl/92JB2Z ,const並
02/28 00:17, 34F

02/28 00:18, , 35F
非指定variable放哪的specifier
02/28 00:18, 35F

02/28 00:26, , 36F
只要符合immutable, const也可以放在stack
02/28 00:26, 36F

04/21 00:58, , 37F
XD 原來後面大大們還有討論這麼多
04/21 00:58, 37F
文章代碼(AID): #1Ohe1xgG (C_and_CPP)