Java: 给变量赋当前值?
Java: Assigning a variable its current value?
如果我有一个当前为空的字符串
String s = "";
并重新分配它
s = "";
我不这样做是不是很糟糕?
if(!s.isEmpty()){
s = "";
}
或者编译器会选择它并为我优化吗?
如果在初始化和再次分配 ""
之间存在任何实际逻辑,编译器可能无法优化它。但如果不这样做也没关系,因为重新分配不会花费大量时间。从理论上讲,如果确实如此,如果它最终成为 "hot spot"代码。
调用方法 isEmpty() 的成本(在线程堆栈中分配新 space 等)抵消了任何收益。如果你想为变量分配一个空字符串,最有效的方法是不使用 if 语句。
不要微观悲观你的代码。
s = "";
赋值由 JIT 翻译成移入寄存器,其中源很可能也驻留在寄存器中(在循环中,除非您 运行 超出寄存器,否则就会完成这种优化)。所以它是最快的指令,只需要一个周期,目前的英特尔可以并行执行其中的 4 个指令。
if(!s.isEmpty()){
s = "";
}
函数调用不是问题,因为它是内联的。但是仍然存在从 String
到 value.length
的内存间接寻址。不错,但已经比简单的方法贵多了。然后是一个条件分支,这可能需要几十个循环,除非结果可以通过CPU来预测。如果不是,您仍然可能很幸运,JIT 可能会通过有条件的移动来替换它。 无论发生什么,它永远不会比更简单的代码更快。
附录
理论上,您可以希望 JIT 发现这两个变体是等价的,并用简单的变体替换悲观的变体。但这两个变体并不等同。你需要使用
if (s != "") {
s = "";
}
而不是内部字符串(即编译时间常量 ""
)。无论如何,我希望我们同意上面的片段是任何人都不应该使用的。
如果我有一个当前为空的字符串
String s = "";
并重新分配它
s = "";
我不这样做是不是很糟糕?
if(!s.isEmpty()){
s = "";
}
或者编译器会选择它并为我优化吗?
如果在初始化和再次分配 ""
之间存在任何实际逻辑,编译器可能无法优化它。但如果不这样做也没关系,因为重新分配不会花费大量时间。从理论上讲,如果确实如此,如果它最终成为 "hot spot"代码。
调用方法 isEmpty() 的成本(在线程堆栈中分配新 space 等)抵消了任何收益。如果你想为变量分配一个空字符串,最有效的方法是不使用 if 语句。
不要微观悲观你的代码。
s = "";
赋值由 JIT 翻译成移入寄存器,其中源很可能也驻留在寄存器中(在循环中,除非您 运行 超出寄存器,否则就会完成这种优化)。所以它是最快的指令,只需要一个周期,目前的英特尔可以并行执行其中的 4 个指令。
if(!s.isEmpty()){
s = "";
}
函数调用不是问题,因为它是内联的。但是仍然存在从 String
到 value.length
的内存间接寻址。不错,但已经比简单的方法贵多了。然后是一个条件分支,这可能需要几十个循环,除非结果可以通过CPU来预测。如果不是,您仍然可能很幸运,JIT 可能会通过有条件的移动来替换它。 无论发生什么,它永远不会比更简单的代码更快。
附录
理论上,您可以希望 JIT 发现这两个变体是等价的,并用简单的变体替换悲观的变体。但这两个变体并不等同。你需要使用
if (s != "") {
s = "";
}
而不是内部字符串(即编译时间常量 ""
)。无论如何,我希望我们同意上面的片段是任何人都不应该使用的。