与空检查相比,变量赋值是否昂贵?例如,在将foo赋值为null之前,是否值得检查foo是否为空?
if (foo != null) {
foo = null;
}
或者这是否令人担忧?
答案 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” (在其声明之外)是 通常不好的形式。有时候, 任务是指示 程序员并不完全 了解正在发生的事情 码。注意:这种分配 可能在极少数情况下有用 鼓励垃圾收集。如果 这就是你用它的原因 无论如何,无视这条规则: - )
总的来说,我个人对任何试图鼓励垃圾收集的事情都很谨慎(你几乎总能得到你没想到的效果)。