C_and_CPP 板


LINE

开发平台(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
25F:→ uranusjr: http://wp.me/p1fTCO-D8 虽然是不同的状况, 但这也是加 02/26 23:27
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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP