Java 两个小结构的性能差异
我想知道下面两个之间是否有性能差异Java 两个小结构的性能差异,java,performance,if-statement,conditional-statements,Java,Performance,If Statement,Conditional Statements,我想知道下面两个之间是否有性能差异 if(i>=0){ //some code here } //and if(i>-1){ //some code here } if(i>=0){ //some code here } //and if(i>0 || i==0){ //some code here } 接下来的两个呢 if(i>=0){ //some code here } //and if(i>-1)
if(i>=0){
//some code here
}
//and
if(i>-1){
//some code here
}
if(i>=0){
//some code here
}
//and
if(i>0 || i==0){
//some code here
}
接下来的两个呢
if(i>=0){
//some code here
}
//and
if(i>-1){
//some code here
}
if(i>=0){
//some code here
}
//and
if(i>0 || i==0){
//some code here
}
是否将=
内部转换为|124;==
另外,性能差异非常小,可以忽略不计,但我想知道是否存在任何性能差异?我认为第一种方法更好 第二个需要3个比较:
if(i>0)
if(i==0)
也许基准测试是个更好的主意。我认为第一种方法更好 第二个需要3个比较:
if(i>0)
if(i==0)
也许基准测试是一个更好的主意。您可以使用
objdump
检查相应的汇编代码,或者检查在运行时实际失效的指令数。但是,使用管道,所需的实际周期可能不太清楚。您可以使用objdump
检查相应的汇编代码,或者检查在运行时实际失效的指令数。然而,对于管道,所需的实际周期可能不太清楚。答案取决于平台;i、 它将取决于Java安装中的硬件平台、ISA和JIT编译器
这使得知道答案变得毫无意义。。。因为您不想浪费时间为特定的硬件/ISA/JIT编译器平台进行微优化
但是如果你确实需要知道,那么你应该对它进行基准测试。。。注意做所有需要做的事情,从Java基准测试中获得有效的结果
FWIW-我认为现代JIT编译器将在所有这两种情况下为子类生成等效的本机代码;i、 e.使用哪一个对性能没有影响。但是
i>0 | i==0
是毫无意义的混淆,因此应该避免;i、 它将取决于Java安装中的硬件平台、ISA和JIT编译器
这使得知道答案变得毫无意义。。。因为您不想浪费时间为特定的硬件/ISA/JIT编译器平台进行微优化
但是如果你确实需要知道,那么你应该对它进行基准测试。。。注意做所有需要做的事情,从Java基准测试中获得有效的结果
FWIW-我认为现代JIT编译器将在所有这两种情况下为子类生成等效的本机代码;i、 e.使用哪一个对性能没有影响。但是
i>0 | | i==0
是毫无意义的混淆,因此应该避免。在现代JVM上,我认为这种思维方式是毫无意义的。JVM不只是编译代码并停止。它在运行时了解您的代码,并相应地修改其行为。现在我不是一个编译器专家,但据我所知,JVM可以非常智能,如果它看到I
的值总是求值为真或假,它基本上可以在运行时优化整个if
语句
每当你想用这样的微观方式“优化”你的代码时,只要停下来提醒自己,你没有JVM那么聪明,因为它会作弊。它可以实际查看代码在运行时的行为,并相应地更改其行为
请查看Steve Yegge演讲中的精彩内容,该演讲暗示了虚拟机可以给人留下多么深刻的印象。这是几年前的事了
添加了更好的示例
这些是Josh Bloch演讲中的幻灯片,他在演讲中谈到微观基准测试现在是多么不可能。您不能只看一行源代码就知道JVM在运行时会做什么。我最喜欢的幻灯片是像&&
这样的短路操作员过去总是更快,但在现代硬件上,这不再总是正确的。完全违反直觉,这意味着你应该停止沿着这条路走下去
在现代JVM上,我认为这种想法是毫无意义的。JVM不只是编译代码并停止。它在运行时了解您的代码,并相应地修改其行为。现在我不是一个编译器专家,但据我所知,JVM可以非常智能,如果它看到
I
的值总是求值为真或假,它基本上可以在运行时优化整个if
语句
每当你想用这样的微观方式“优化”你的代码时,只要停下来提醒自己,你没有JVM那么聪明,因为它会作弊。它可以实际查看代码在运行时的行为,并相应地更改其行为
请查看Steve Yegge演讲中的精彩内容,该演讲暗示了虚拟机可以给人留下多么深刻的印象。这是几年前的事了
添加了更好的示例
这些是Josh Bloch演讲中的幻灯片,他在演讲中谈到微观基准测试现在是多么不可能。您不能只看一行源代码就知道JVM在运行时会做什么。我最喜欢的幻灯片是像&&
这样的短路操作员过去总是更快,但在现代硬件上,这不再总是正确的。完全违反直觉,这意味着你应该停止沿着这条路走下去
它取决于实现,因此您需要为您的特定pla进行基准测试