[問題] const array 放function內會拖慢執行速度
開發平台(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
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
02/23 15:31, 2F
→
02/23 15:32, , 3F
02/23 15:32, 3F
難過了
vc2013不支援 constexpr
※ 編輯: ofd168 (60.250.205.229), 02/23/2017 16:06:56
推
02/23 16:09, , 4F
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
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
02/23 18:45, 8F
→
02/23 18:46, , 9F
02/23 18:46, 9F
→
02/23 18:47, , 10F
02/23 18:47, 10F
→
02/23 18:54, , 11F
02/23 18:54, 11F
table1[0]會比原本多1
看起來的確是每次進去都會要一塊空間,把值複製進去......
→
02/23 18:58, , 12F
02/23 18:58, 12F
寫入會發生違規
推
02/23 19:01, , 13F
02/23 19:01, 13F
→
02/23 19:02, , 14F
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
02/23 21:07, 15F
→
02/23 21:07, , 16F
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
02/24 01:14, 18F
→
02/24 01:15, , 19F
02/24 01:15, 19F
→
02/24 01:24, , 20F
02/24 01:24, 20F
推
02/25 02:04, , 21F
02/25 02:04, 21F
推
02/25 14:23, , 22F
02/25 14:23, 22F
推
02/26 04:21, , 23F
02/26 04:21, 23F
→
02/26 23:26, , 24F
02/26 23:26, 24F
→
02/26 23:27, , 25F
02/26 23:27, 25F
→
02/26 23:27, , 26F
02/26 23:27, 26F
推
02/27 06:33, , 27F
02/27 06:33, 27F
→
02/27 06:35, , 28F
02/27 06:35, 28F
→
02/27 06:36, , 29F
02/27 06:36, 29F
推
02/27 06:39, , 30F
02/27 06:39, 30F
→
02/27 06:39, , 31F
02/27 06:39, 31F
→
02/27 06:39, , 32F
02/27 06:39, 32F
→
02/27 06:39, , 33F
02/27 06:39, 33F
推
02/28 00:17, , 34F
02/28 00:17, 34F
→
02/28 00:18, , 35F
02/28 00:18, 35F
→
02/28 00:26, , 36F
02/28 00:26, 36F
→
04/21 00:58, , 37F
04/21 00:58, 37F