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