要检查还是不检查(到Nothing(null))?

时间:2010-06-28 00:34:17

标签: .net performance

效果视图中,最好在设置之前检查是否检查Nothing(null)?

很明显,为了便于阅读,可能不需要补充步骤,但性能如何?如果不需要?!

,测试IF可以减少设置为NULL的时间

我在计算机上运行它,结果是一样的。

  Dim sw As New Stopwatch()

  sw.Start()
  For i As Integer = 0 To 10000
    _MyObject = Nothing
  Next

  sw.Stop()
  Console.WriteLine("no check: {0}", sw.Elapsed)
  sw.Reset()

  sw.Start()
  For i As Integer = 0 To 10000
    If _MyObject IsNot Nothing Then
      _MyObject = Nothing
    End If
  Next

  sw.Stop()
  Console.WriteLine("with check: {0}", sw.Elapsed)

结果:

  

不检查:00:00:00.00003 26
  支票:00:00:00.00003 49

6 个答案:

答案 0 :(得分:1)

  If _MyCustomObject IsNot Nothing Then
      _MyCustomObject = Nothing

我的猜测是两者之间确实没有区别。如果有的话,它可以忽略不计(微优化)。 (就像我在评论中所说的那样,if语句很可能更慢)。而且这个更冗长。你不在乎它是否一无所有,你只需要在你完成时就什么都不做。您需要在不需要的地方添加额外的步骤。正常阅读的代码越少意味着它对读者来说更清晰,而且在我的书中更好。

在设置值之前,有时您需要检查。假如您必须从数据库中检索值,但这很可能不是其中之一。

答案 1 :(得分:1)

确实没有合理的理由来检查该值是否为null / Nothing。正如你所看到的那样,无论如何你都会在表现上轻微打击。

答案 2 :(得分:1)

你的秒表时间相同的原因是因为你没有在两轮之间重置秒表。 StartNew()不起作用。从第二次运行开始的sw.Elapsed报告与第一次运行相同的时间。

用重启替换sw.StartNew():

sw.Restart()

当我在我的机器上运行它时,我分别得到.248和.592。

从性能角度来看,添加If语句总是较慢。但是,从最佳实践的角度来看,在使用对象之前,应始终检查对象是否为空。

答案 3 :(得分:1)

如果需要将其设置为null,则只需设置它即可。这样的代码更具可读性。

有一个额外的if也可能有perf含义,但编译器可能足够聪明,可以将其优化,所以你的测试可能无法区分。

因此,将其设置为null有两个好处

  • 可读性(更重要的一个)
  • 由于缺少if,可能性能更好。

执行非空检查的一个可能的好处是.net引擎可能运行一些关于在将stuff设置为null时超出范围的对象的额外代码。但我认为这不足以成为牺牲可读性的理由。

答案 4 :(得分:1)

一般来说,在现代CPU上,最好总是进行一些小操作而不是检查,然后只在必要时再进行操作。这是因为分支指令可能会破坏CPU中的管道,从而导致显着(几个周期)的延迟。如果你总是进行小型操作,不仅没有时间进行比较,也没有机会拖延管道。

换句话说,检查几乎没有办法让事情变得更快,并且可能会减慢速度。可能的是,JIT优化器无论如何都会移除If

答案 5 :(得分:0)

编译器删除if测试并为两者生成完全相同的IL,我不会感到惊讶。但是你可以在生成的程序集上运行ilasm来确定。