在效果视图中,最好在设置之前检查是否检查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
答案 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有两个好处
执行非空检查的一个可能的好处是.net引擎可能运行一些关于在将stuff设置为null时超出范围的对象的额外代码。但我认为这不足以成为牺牲可读性的理由。
答案 4 :(得分:1)
一般来说,在现代CPU上,最好总是进行一些小操作而不是检查,然后只在必要时再进行操作。这是因为分支指令可能会破坏CPU中的管道,从而导致显着(几个周期)的延迟。如果你总是进行小型操作,不仅没有时间进行比较,也没有机会拖延管道。
换句话说,检查几乎没有办法让事情变得更快,并且可能会减慢速度。可能的是,JIT优化器无论如何都会移除If
。
答案 5 :(得分:0)
编译器删除if测试并为两者生成完全相同的IL,我不会感到惊讶。但是你可以在生成的程序集上运行ilasm来确定。