如果我有一个当前为空的字符串
String s = "";
并重新分配
s = "";
这不好我不这样做吗?
if(!s.isEmpty()){
s = "";
}
或者编译器是否会接受它并为我进行优化?
答案 0 :(得分:5)
调用方法isEmpty()(在线程堆栈中分配新空间等)的成本否定任何收益。如果你想为变量分配一个空字符串,那么在没有if语句的情况下这样做是最有效的。
答案 1 :(得分:1)
s = "";
JIT转换为转移到寄存器中,其中源很可能也驻留在寄存器中(在循环中,除非用完寄存器,否则这样的优化就完成了)。因此,它是最快的指令,仅需一个周期,当前的英特尔可以并行执行其中的4个。
if(!s.isEmpty()){
s = "";
}
函数调用不是问题,因为它被内联。但是,从String
到value.length
,仍然存在内存间接。不错,但已经比简单的方式更昂贵了。然后是一个条件分支,可能需要几十个周期,除非结果可以由CPU预测。如果没有,你仍然可能是幸运的,JIT可能会通过有条件的举动取而代之。 无论发生什么,它都不会比简单的代码更快。
理论上,你可能希望JIT发现这两个变体是等价的,并用简单的变体取代了这个变体。但这两种变体并不相同。您需要使用
if (s != "") {
s = "";
}
而是因为可能存在其他空字符串而不是被插入的字符串(即编译时常量""
)。无论如何,我希望我们同意上面的片段是没有人应该使用的东西。
答案 2 :(得分:0)
如果初始化和再次分配""
的点之间存在任何实际逻辑,则编译器可能无法对其进行优化。但如果没有,那就好了,因为重新分配不会占用任何重要的时间。从理论上讲,如果确实如此,JVM中的即时编译器(JIT)(无论如何,Oracle的JVM)会尝试优化它(如果可能的话),如果它最终成为“热点”中的“热点”。代码。