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总是错误的。然而,我不确定情况是否如此,我几周前刚读到关于分支预测的文章。非常有趣的概念!