作者ofd168 ()
看板C_and_CPP
标题[问题] const array 放function内会拖慢执行速度
时间Thu Feb 23 14:25:56 2017
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1487831163.A.A90.html
1F:→ shadow0326: inline拿掉,或variable改static 02/23 14:31
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
2F:推 shadow0326: 唔 我以为这种const array会在编译期就做掉 02/23 15:31
3F:→ shadow0326: 不然可以用constexpr试试看 02/23 15:32
难过了
vc2013不支援 constexpr
※ 编辑: ofd168 (60.250.205.229), 02/23/2017 16:06:56
4F:推 ilms49898723: 让那两个阵列变static 02/23 16:09
5F:推 Zephyr750: 变慢的原因,是建构的过程吧?宣告阵列的时候要记忆体 02/23 16:31
6F:→ Zephyr750: 规划 02/23 16:31
在function内加上static的确速度就回来了
我以为写const,呼叫function不会另外要记忆体
这样不就有没有const都会差不多@@?
这样是说,只要const array前面都要加上static以增加速度@@?
一般一个值的const也需要加吗?
7F:→ hichcock: 你这个 function 被执行几次? 02/23 16:57
基本上超级多次,应该是其他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
8F:推 yvb: 试问 table()中, 写一句 *((double *)table1) = *table1 + 1; 02/23 18:45
9F:→ yvb: 可不可以? 若可以, 呼叫 table() 十次後, *table1 会是多少? 02/23 18:46
10F:→ yvb: 试试看写在 function 内和 function 外的差别. 02/23 18:47
11F:→ yvb: 上一句是指 const array. 02/23 18:54
table1[0]会比原本多1
看起来的确是每次进去都会要一块空间,把值复制进去......
12F:→ yvb: const array 加上 static 也可以再试试看. 02/23 18:58
写入会发生违规
13F:推 kokal: non-variable放在stack, static variable跟global放在同区 02/23 19:01
14F:→ kokal: 所以每进function一次,就建立一次array然後再消灭 02/23 19:02
看起来的确是
所以写const只不过是告诉compiler不可以更改,可是实际上行为跟一般array一样
都是需要要空间 -> initialize........
天啊,我一直以为他是当成程式码放在一起耶...... (不知道哪里来的观念)
另外,想问是否该加上inline/改成macro呢?
※ 编辑: ofd168 (60.250.205.229), 02/23/2017 19:14:59
15F:→ kokal: inline建议complier展开省去branch, macro是compiler在 02/23 21:07
16F:→ kokal: front end阶段去替换内容 02/23 21:07
17F:→ kokal: 不太清楚你想要做甚麽 02/23 21:10
单纯想说这个程式码超级短,基本上就把两个ARRAY串起来,用inline或macro会不会比较快XDDD
毕竟这个function会被呼叫超多次
※ 编辑: ofd168 (123.195.57.89), 02/23/2017 22:45:12
18F:→ kokal: macro不影响,macro只是在compile code前就字替换掉 02/24 01:14
19F:→ kokal: 但是inline要看compiler是否打算把code展开省去jump 02/24 01:15
20F:→ kokal: 我觉得既然是const array就直接合并,对index操作就好啦 02/24 01:24
21F:推 jackyhuang: 用 nm 看 symbol table, 你就会知道差异在哪了 02/25 02:04
22F:推 yvb: 真没试过用 nm 看 VC2013 编译出来的程式... 可行吗? 02/25 14:23
23F:推 jackyhuang: 可能不行,不过 ms 上也有类似的 dumpbin.exe 02/26 04:21
24F:→ uranusjr: 我觉得你只是单纯踩到 VC++ 的 bug 了 XDDD 02/26 23:26
26F:→ uranusjr: 了 const 反而会让 VC++ 做错事的例子 02/26 23:27
27F:推 LPH66: 那个微软 bug tracker 里回文的 Geoff 的论点简直奇文共赏 02/27 06:33
28F:→ LPH66: compiler 也是程式, 做错事就得修, 哪有一定要绕过的道理.. 02/27 06:35
29F:→ LPH66: 移掉三个 const 可以省掉 900K 程式各种意味上都是神奇 02/27 06:36
30F:推 friends29: 在function外面写array 指标传进去加const也可以呀 要 02/27 06:39
31F:→ friends29: 考虑速度的话重复执行很多次的部分尽量不要包含memory 02/27 06:39
32F:→ friends29: allocation deallocation 你可以写一个回圈 new delet 02/27 06:39
33F:→ friends29: e 很多次抓个时间就知道了 02/27 06:39
34F:推 kokal: @uranusjr 原po的不能算是bug,根据 goo.gl/92JB2Z ,const并 02/28 00:17
35F:→ kokal: 非指定variable放哪的specifier 02/28 00:18
36F:→ kokal: 只要符合immutable, const也可以放在stack 02/28 00:26
37F:→ ofd168: XD 原来後面大大们还有讨论这麽多 04/21 00:58