与空检查相比,变量赋值是否昂贵?例如,是否值得在将 foo 分配为 null 之前检查它是否不为 null?
if (foo != null) {
foo = null;
}
还是这没什么好担心的?
与空检查相比,变量赋值是否昂贵?例如,是否值得在将 foo 分配为 null 之前检查它是否不为 null?
if (foo != null) {
foo = null;
}
还是这没什么好担心的?
这是一个微优化(无论如何可能由编译器处理)。别担心。通过专注于您的程序实际算法,您将获得更大的回报。
我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。——唐纳德·克努斯
这实际上(非常非常轻微)效率较低。变量赋值大致相当于空检查,另外还有一个额外的分支可能。并不是说它有很大的不同。
还是这没什么好担心的?
你说对了。
我不会担心 - 这只是需要维护的额外代码行。这是你永远不应该做的那种微优化,除非你有大量的文件证明这是你的瓶颈。
首先是微优化。所以不用太担心。
但是要回答您的问题,您需要将其减少到一行。(正如您的所有代码所做的那样,将其设置为 NULL)。
foo = NULL;
原因是,
比较是一个比赋值更昂贵的操作。(因为比较比较吃掉了许多汇编指令。通常是减法和与零的比较或异或和与零的比较)。赋值占用更少的指令。
如果您有一个不错的编译器,它们将生成相同的代码。如果您有一个糟糕的编译器,那么带有 的编译器if
会更糟。在 2009 年,对变量的硬件分配非常便宜,而条件分支有时可能很昂贵。
foo = null;
if (foo != null)
foo = null;
如果我查看第二个块代码,我会认为您只想将 foo 变量设置为 null 如果它之前不为 null,如果我查看第一个代码,我会认为您想将变量 foo 设置为 null反正。
我知道这是因为您编写的示例,但最终这种微优化只会增加混乱(不值得)。
这将使您的代码更难阅读,即使它是一种优化,也不值得麻烦。
这不是优化。在大多数现代 cpu 的 if 语句上非常昂贵。
这将几乎没有影响。我认为您甚至无法创建一个基准来证明差异。
事实上,有些人会争辩说,分配给 null 是一种代码味道(请参阅PMD 检测器的 NullAssignment):
将“null”分配给变量(在其声明之外)通常是不好的形式。有时,赋值表明程序员没有完全理解代码中发生了什么。注意:这种分配在极少数情况下可能有助于鼓励垃圾收集。如果这就是您使用它的目的,请务必忽略此规则:-)
一般来说,我个人对任何试图鼓励垃圾收集的事情持怀疑态度(你几乎总是会得到你没想到的效果)。