代码之家  ›  专栏  ›  技术社区  ›  Albert

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

  •  6
  • Albert  · 技术社区  · 17 年前

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

    还是说这没什么好担心的?

    8 回复  |  直到 17 年前
        1
  •  31
  •   Mike Douglas    17 年前

    这是一个微观优化(也可能是由编译器处理的)。别担心。通过专注于你的程序实际算法,你会得到更大的回报。

    我们应该忘记小效率,大约97%的情况下:过早优化是万恶之源。——高德纳

        2
  •  7
  •   Michael Myers KitsuneYMG    17 年前

    这实际上是(非常、非常轻微) 高效。变量赋值大致相当于空检查,而且可能还有一个额外的分支。这并没有多大区别。

    还是说这没什么好担心的?

    你明白了。

        3
  •  3
  •   Hank Gay    17 年前

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

        4
  •  2
  •   Real Red.    17 年前

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

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

    foo = NULL;
    

    原因是,

    比较比分配要昂贵得多。(因为比较会相对地消耗许多汇编指令。通常是减法和与零的比较,或者XOR和与零进行比较)。作业占用的指令更少。

        5
  •  2
  •   Norman Ramsey    17 年前

    如果你有一个像样的编译器,它们会生成相同的代码。如果你有一个糟糕的编译器,那就是 if 情况会更糟。在2009年,变量的硬件分配非常便宜,条件分支有时可能很昂贵。

        6
  •  1
  •   Ravi Wallau    17 年前
    
    foo = null;
    
    
    if (foo != null)
       foo = null;
    

    如果我看第二个块代码,我会认为你只想在foo变量之前不为null的情况下将其设置为null,如果我看第一个代码,我认为你无论如何都想将变量foo设置为null。

        7
  •  1
  •   Mendelt    17 年前

    这将使你的代码更难阅读,即使是优化,也不值得费心。

        8
  •  1
  •   Bob Cross n8wrl    17 年前

    这将产生很小或没有影响。我认为你甚至无法创建一个基准来证明这种差异。

    事实上,有些人会认为将null赋值根本就是一种代码气味(参见 PMD detector for NullAssignment ):

    为变量赋值“null” (声明之外) 通常不好的形式。有时 作业表明 程序员并不完全 了解正在发生的事情 代码。注意:此类作业 鼓励垃圾收集。如果 这就是你使用它的目的 无论如何,忽略这条规则:-)

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