在赋值为null之前检​​查变量是否为null?

时间:2009-02-24 20:32:19

标签: java compiler-construction performance clarity

与空检查相比,变量赋值是否昂贵?例如,在将foo赋值为null之前,是否值得检查foo是否为空?

if (foo != null) {
     foo = null;
}

或者这是否令人担忧?

8 个答案:

答案 0 :(得分:31)

这是一种微观微观优化(可能还有编译器处理的东西)。别担心。通过专注于您的程序实际算法,您将获得更大的回报。

  

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。 - 唐纳德克努特

答案 1 :(得分:7)

这实际上(非常,非常轻微)较少有效。变量赋值大致相当于空值检查,另外还有一个额外的分支。并不是说它有很大的不同。

  

或者这是否令人担忧?

你明白了。

答案 2 :(得分:3)

我不担心它 - 它只是需要额外的代码行来维护。这是一种你不应该做的微优化,除非你有很多的文件证据证明它是你的瓶颈。

答案 3 :(得分:2)

首先,它是微观优化。所以不用担心它。

但要回答你的问题,你需要将它减少到一行。 (因为您的所有代码都是将其设置为NULL)。

foo = NULL;

原因是,

比较是比分配更昂贵的操作。 (因为比较比较地吃掉了许多汇编指令。通常是减法和与零或XOR的比较并与零比较)。分配占用较少的指令。

答案 4 :(得分:2)

如果你有一个不错的编译器,他们将生成相同的代码。如果你有一个糟糕的编译器,if的编译器会更糟。在2009年,变量的硬件分配非常便宜,有条件分支有时可能很昂贵。

答案 5 :(得分:1)


foo = null;

if (foo != null)
   foo = null;

如果我查看第二个块代码,我会认为你只想将foo变量设置为null,如果之前它不是null,并且如果我查看第一个代码我会认为你想设置变量无论如何,foo为null。

我知道这是因为你写的例子,但最后这种微优化只会增加混乱(这不值得)。

答案 6 :(得分:1)

这将使你的代码更难以阅读,即使它是一个优化,也不值得麻烦。

这不是优化。在大多数现代cpu的if语句都非常昂贵。

答案 7 :(得分:1)

这几乎没有效果。我认为你甚至不能创建一个基准来证明这种差异。

事实上,有些人认为分配给null根本就是代码气味(参见PMD detector for NullAssignment):

  

为变量指定“null”   (在其声明之外)是   通常不好的形式。有时候,   任务是指示   程序员并不完全   了解正在发生的事情   码。注意:这种分配   可能在极少数情况下有用   鼓励垃圾收集。如果   这就是你用它的原因   无论如何,无视这条规则: - )

总的来说,我个人对任何试图鼓励垃圾收集的事情都很谨慎(你几乎总能得到你没想到的效果)。