1
lzhtony 2015-10-07 00:13:44 +08:00
同一个变量多次声明(比如循环中)编译器一般会优化,不同的变量肯定是不行了.
|
2
squid157 2015-10-07 00:17:26 +08:00
解释器那样的估计会有小提升。但这个算不算 premature optimization ,我就不知道了。还是写完了跑 profile 吧。
|
3
zonyitoo 2015-10-07 00:26:40 +08:00
无论如何,你的那个「变量」肯定是要重新给初始值的吧,那么这一次的初始化无可避免。
函数调用时的局部变量就放在栈上,通过 esp, ebp 来找到相对应的栈内存空间,不觉得这里面会有什么可以优化的地方。 而且,编译器可能会把一些临时变量放到寄存器上的,你放在全局那就肯定不能做这个优化了吧。 |
4
msg7086 2015-10-07 04:07:12 +08:00
通常编译器会帮你优化掉。
|
5
Andiry 2015-10-07 04:32:48 +08:00
提升到全局以缓存是什么鬼,难道放在栈里就不会缓存了吗?
|
6
ryd994 2015-10-07 07:11:26 +08:00 via Android
别,编译器优化比人强
|
7
iyangyuan 2015-10-07 09:34:10 +08:00 via iPhone
这种优化带来的效率提升可以忽略不计,一般是优化算法或者架构
|
8
firebroo 2015-10-07 11:14:52 +08:00 via Android
声明,定义, lz 的“声明”应该是定义,“赋值”应该是初始化。 c 语言的 extern 声明是给编译器看的。
|
9
yuchting 2015-10-07 11:54:46 +08:00
我曾经试图想超过编译器优化,从 java 到 c/c++,最后在 c 混合编程 asm 中的一句 sincos cpu 浮点运算器的指令中战胜了 c 本身调用 sin 、 cos 函数加起来的时间。
从此,我再也不想什么语法优化了,在算法上下功夫优化才是正道…… |
10
luoway OP @yuchting 这个例子明明是说语法优化不如直接用汇编语言……
按问题描述,我想到的是这样提升到全局,会污染全局变量的命名空间,而对性能的改善不明显。 现在参考大家的想法看来,对性能的改善都没有,的确是个馊主意了 |
11
semicircle21 2015-10-07 20:27:35 +08:00
对性能的优化微乎其微, 而且这样你的函数就不可重入的了..
更详细的分析要看代码。 |
12
akira 2015-10-07 22:57:03 +08:00
对于大部分编译型语言来说,很有可能不但没有性能上的改善,反而会导致性能下降。
|
13
qwsqwa 2015-10-08 13:44:49 +08:00
C/C++中有静态局部变量, static 关键字。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
|
14
qwsqwa 2015-10-08 13:45:35 +08:00
java 和 C#中好像也有,其他语言就不清楚了。
|
15
VYSE 2015-10-08 15:10:23 +08:00
以 C 、 X86 为例,不论你多少层循环,所有使用的局部变量都在进入函数前预先确定在当前 stack frame 的偏移,而栈在程序启动时候就预先分配好固定尺寸了,之后仅仅是算个内存地址存哪而已,除非放在堆上动态 malloc 。
也就说本来就是栈上的一个复用内存,跟全局变量一个概念(好吧全局变量就是放在低的栈上)。 而且全局会变慢, CPU CACHE 一段运行时连续的内存区域,因此在一个函数里操作自己栈上东西都可以在 CPU 内部完成,而 refer 一个远处的全局内存, CPU 不得不去到低速的内存上去访问数据。 |