Java:为变量赋值当前值?

时间:2015-06-18 07:11:36

标签: java optimization variable-assignment

如果我有一个当前为空的字符串

String s = "";

并重新分配

s = "";

这不好我不这样做吗?

if(!s.isEmpty()){
   s = "";
}

或者编译器是否会接受它并为我进行优化?

3 个答案:

答案 0 :(得分:5)

调用方法isEmpty()(在线程堆栈中分配新空间等)的成本否定任何收益。如果你想为变量分配一个空字符串,那么在没有if语句的情况下这样做是最有效的。

答案 1 :(得分:1)

不要对代码进行微观设置。

s = "";

JIT转换为转移到寄存器中,其中源很可能也驻留在寄存器中(在循环中,除非用完寄存器,否则这样的优化就完成了)。因此,它是最快的指令,仅需一个周期,当前的英特尔可以并行执行其中的4个。

if(!s.isEmpty()){
   s = "";
}

函数调用不是问题,因为它被内联。但是,从Stringvalue.length,仍然存在内存间接。不错,但已经比简单的方式更昂贵了。然后是一个条件分支,可能需要几十个周期,除非结果可以由CPU预测。如果没有,你仍然可能是幸运的,JIT可能会通过有条件的举动取而代之。 无论发生什么,它都不会比简单的代码更快。

附录

理论上,你可能希望JIT发现这两个变体是等价的,并用简单的变体取代了这个变体。但这两种变体并不相同。您需要使用

if (s != "") {
    s = "";
}
而是因为可能存在其他空字符串而不是被插入的字符串(即编译时常量"")。无论如何,我希望我们同意上面的片段是没有人应该使用的东西。

答案 2 :(得分:0)

如果初始化和再次分配""的点之间存在任何实际逻辑,则编译器可能无法对其进行优化。但如果没有,那就好了,因为重新分配不会占用任何重要的时间。从理论上讲,如果确实如此,JVM中的即时编译器(JIT)(无论如何,Oracle的JVM)会尝试优化它(如果可能的话),如果它最终成为“热点”中的“热点”。代码。