在If条件下检查obj == null更多性能有效然后obj!= null

时间:2014-08-27 08:01:46

标签: java performance null

根据我的一个高级编码风格2的性能比编码风格1更好,是真的吗?

编码风格1

If (obj!=null)
{
   Logic A
}

else
{
   Logic B
}

编码风格2

If (obj==null)
{
   Logic B
}

else
{
   Logic A
}

4 个答案:

答案 0 :(得分:5)

在这样的例子中,您应该担心的是开发人员的表现。什么是最干净,最简单的代码,这通常是一个JIT优化器将做得很好的模式,如果不是最好的工作。

在这个例子中,即使您可以测量差异,我也会怀疑

  • 你的考试被打破了。
  • 不同的机器或JVM上的差异会有所不同。
  • 这种差异将在Java的未来版本中消失。
BTW:查看字节代码是一种非常糟糕的性能测量,但我可以说字节代码生成,我怀疑生成的本机代码长度是相同的。

答案 1 :(得分:2)

只能在机器代码级别上观察是否更快地测试null或非null,您几乎无法控制。您的Java文件将被编译为字节码,然后在运行时,该字节码将由Just-in-Time编译器(JIT)再次编译为机器代码。 JIT执行所有高级优化的孩子,其中一个可能是分支条件反转的分支重新排序。

请注意,用于测试变量值的CPU周期将与分支错误预测中的惩罚相比相形见绌,因此正确的分支预测是JIT编译器最关注的问题。您在Java源代码级别上完全无法控制这些细微之处。

因此,一致的建议是注意编写最自然的代码,不要再考虑分支排序的性能差异。

答案 2 :(得分:1)

表现不应该像 Peter Lawrey 所指出的那样有所作为。

我猜你的朋友没有谈论表现,而是讨论编码风格

当使用if else构造时,人们经常发现在处理if块中的否定情况之前,首先处理else块中的非否定情况更为可取。

所以最好写一下

if (a == b) {
    logicA();
}
else {
    logicB();
}

而不是写

if (a != b) {
    logicB();
}
else {
    logicA();
}

因为它通常会导致更好的可读性

答案 3 :(得分:0)

您的大四学生应提供“可衡量的”测试用例,以向您证明哪种逻辑更好。

您不必担心优化逻辑,因为编译器会为您完成所有优化。相反,关注代码的可读性(和流逻辑?)。例如,Java 7引入了<T> T Objects.requireNotNull(T obj)方法,该方法在内部执行:

if (obj == null) {
    throw new NullPointerException();
}

return x;

哪个更好,特别是在创建API时,因为你有一个“断言”/保证不为空的业务逻辑。