6

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

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

还是这没什么好担心的?

4

8 回答 8

31

这是一个微优化(无论如何可能由编译器处理)。别担心。通过专注于您的程序实际算法,您将获得更大的回报。

我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。——唐纳德·克努斯

于 2009-02-24T20:34:16.750 回答
7

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

还是这没什么好担心的?

你说对了。

于 2009-02-24T20:35:13.127 回答
3

我不会担心 - 这只是需要维护的额外代码行。这是你永远不应该做的那种微优化,除非你有大量的文件证明这是你的瓶颈。

于 2009-02-24T20:35:13.893 回答
2

首先是微优化。所以不用太担心。

但是要回答您的问题,您需要将其减少到一行。(正如您的所有代码所做的那样,将其设置为 NULL)。

foo = NULL;

原因是,

比较是一个比赋值更昂贵的操作。(因为比较比较吃掉了许多汇编指令。通常是减法和与零的比较或异或和与零的比较)。赋值占用更少的指令。

于 2009-02-24T20:53:25.440 回答
2

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

于 2009-02-26T03:44:33.273 回答
1

foo = null;

if (foo != null)
   foo = null;

如果我查看第二个块代码,我会认为您只想将 foo 变量设置为 null 如果它之前不为 null,如果我查看第一个代码,我会认为您想将变量 foo 设置为 null反正。

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

于 2009-02-24T20:36:37.120 回答
1

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

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

于 2009-02-24T20:37:06.900 回答
1

这将几乎没有影响。我认为您甚至无法创建一个基准来证明差异。

事实上,有些人会争辩说,分配给 null 是一种代码味道(请参阅PMD 检测器的 NullAssignment):

将“null”分配给变量(在其声明之外)通常是不好的形式。有时,赋值表明程序员没有完全理解代码中发生了什么。注意:这种分配在极少数情况下可能有助于鼓励垃圾收集。如果这就是您使用它的目的,请务必忽略此规则:-)

一般来说,我个人对任何试图鼓励垃圾收集的事情持怀疑态度(你几乎总是会得到你没想到的效果)。

于 2009-02-24T20:44:23.277 回答