Java 两个示例之间的最佳性能
Java 两个示例之间的最佳性能,java,Java,性能测试1: public class PerformanceTest1 { public static void main(String[] args) { boolean i = false; if (i == false) i = true; System.out.println(i); } } 性能测试2: public class PerformanceTest2 {
性能测试1
:
public class PerformanceTest1 {
public static void main(String[] args) {
boolean i = false;
if (i == false)
i = true;
System.out.println(i);
}
}
性能测试2
:
public class PerformanceTest2 {
public static void main(String[] args) {
boolean i = false;
i = true;
System.out.println(i);
}
}
我一直在问自己关于这两种可能性,什么能提供最好的性能。我不知道每次执行while(true)
循环时检查if(I==false)
(在PerformanceTest1
)是否比每次执行while(true)
循环时只设置I=true
的性能更差
问:那么,PerformanceTest1
或PerformanceTest2
将提供最佳性能?为什么?
编辑:
所以,根据答案,我想下面代码的性能也会一样
public class PerformanceTest1 {
public static void main(String[] args) {
Point i;
if (i == null)
i = new Point();
}
}
public class PerformanceTest2 {
public static void main(String[] args) {
Point i;
i = new Point();
}
}
这两种方法在性能上没有真正的区别
第一个if测试将只执行一次。这是因为JVM(Java虚拟机)在几次之后不会执行测试,因为我总是这样。我不是JVM和运行时方面的专家,但您甚至可能期望if测试只运行一次 它们的性能相同,但我相信PerformanceTest1可能会占用更多的性能,因为您正在执行额外的操作。简单地为布尔变量赋值比先检查它是否等于false需要更少的性能只会忽略在
内部执行if
的路径,而在经过几次迭代后
将不会有任何差异,因为条件总是false
如果未执行,CPU将保持其执行,并获得100%的预测命中率。因此不会出现回滚,两者基本上是等价的
作为旁注,没有必要使用
i==false
,!i
就足够了。在JIT编译器运行后,这两种方法都是等效的。如果您必须关心其中哪一种性能更好,则可能有问题。赋值的性能是不相关的,因为System.out.println
需要99。(9)%实际运行时间。您正在尝试测量无限循环的性能?re:您的编辑:我怀疑JIT编译器仍然会优化两个循环的内容,因为赋值在程序的其他地方没有任何明显的副作用。如果你展示了更多有用的代码,你可能会得到更多信息的答案。好吧,只有当你在每次迭代中重新评估if
,JIT编译器应该(而且几乎肯定会)优化它,Awai还考虑了分支预测器,但我实际上认为JVM将完全摆脱if测试,因为在这种情况下,I总是错误的。然而,我不确定情况是否如此,我几周前刚读到关于分支预测的文章。非常有趣的概念!