循环调用的函数,将函数变量声明提升到全局以缓存,是否能提高性能?

2015-10-07 00:00:32 +08:00
 luoway
既然是变量,肯定是要赋值的,那么“声明+赋值”,与仅有“赋值”,性能有没有差距呢?

有没有语言是声明一次,指定一块内存空间,而减少声明可以减少这点性能消耗?

感觉有些杞人忧天了……
3331 次点击
所在节点    程序员
15 条回复
lzhtony
2015-10-07 00:13:44 +08:00
同一个变量多次声明(比如循环中)编译器一般会优化,不同的变量肯定是不行了.
squid157
2015-10-07 00:17:26 +08:00
解释器那样的估计会有小提升。但这个算不算 premature optimization ,我就不知道了。还是写完了跑 profile 吧。
zonyitoo
2015-10-07 00:26:40 +08:00
无论如何,你的那个「变量」肯定是要重新给初始值的吧,那么这一次的初始化无可避免。
函数调用时的局部变量就放在栈上,通过 esp, ebp 来找到相对应的栈内存空间,不觉得这里面会有什么可以优化的地方。
而且,编译器可能会把一些临时变量放到寄存器上的,你放在全局那就肯定不能做这个优化了吧。
msg7086
2015-10-07 04:07:12 +08:00
通常编译器会帮你优化掉。
Andiry
2015-10-07 04:32:48 +08:00
提升到全局以缓存是什么鬼,难道放在栈里就不会缓存了吗?
ryd994
2015-10-07 07:11:26 +08:00
别,编译器优化比人强
iyangyuan
2015-10-07 09:34:10 +08:00
这种优化带来的效率提升可以忽略不计,一般是优化算法或者架构
firebroo
2015-10-07 11:14:52 +08:00
声明,定义, lz 的“声明”应该是定义,“赋值”应该是初始化。 c 语言的 extern 声明是给编译器看的。
yuchting
2015-10-07 11:54:46 +08:00
我曾经试图想超过编译器优化,从 java 到 c/c++,最后在 c 混合编程 asm 中的一句 sincos cpu 浮点运算器的指令中战胜了 c 本身调用 sin 、 cos 函数加起来的时间。

从此,我再也不想什么语法优化了,在算法上下功夫优化才是正道……
luoway
2015-10-07 12:48:03 +08:00
@yuchting 这个例子明明是说语法优化不如直接用汇编语言……

按问题描述,我想到的是这样提升到全局,会污染全局变量的命名空间,而对性能的改善不明显。
现在参考大家的想法看来,对性能的改善都没有,的确是个馊主意了
semicircle21
2015-10-07 20:27:35 +08:00
对性能的优化微乎其微, 而且这样你的函数就不可重入的了..
更详细的分析要看代码。
akira
2015-10-07 22:57:03 +08:00
对于大部分编译型语言来说,很有可能不但没有性能上的改善,反而会导致性能下降。
qwsqwa
2015-10-08 13:44:49 +08:00
C/C++中有静态局部变量, static 关键字。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
qwsqwa
2015-10-08 13:45:35 +08:00
java 和 C#中好像也有,其他语言就不清楚了。
VYSE
2015-10-08 15:10:23 +08:00
以 C 、 X86 为例,不论你多少层循环,所有使用的局部变量都在进入函数前预先确定在当前 stack frame 的偏移,而栈在程序启动时候就预先分配好固定尺寸了,之后仅仅是算个内存地址存哪而已,除非放在堆上动态 malloc 。
也就说本来就是栈上的一个复用内存,跟全局变量一个概念(好吧全局变量就是放在低的栈上)。
而且全局会变慢, CPU CACHE 一段运行时连续的内存区域,因此在一个函数里操作自己栈上东西都可以在 CPU 内部完成,而 refer 一个远处的全局内存, CPU 不得不去到低速的内存上去访问数据。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225992

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX