【发布时间】:2017-03-17 02:05:49
【问题描述】:
下面这句话我已经看了好几遍了:
一般来说,变量应该被赋予最小的作用域。
查看变量num在以下场景中的使用:
Private num As Integer
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
'Your code where num is initialized and used
End Sub
或者:
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
Dim num As Integer
'Your code where num is initialized and used
End Sub
请记住Timer_Tick 是一个循环计时器,因此num 在第一种情况下只声明一次,而在第二种情况下,它会在每次计时器计时时声明一次。
第一次使用在代码执行速度方面真的不一样吗?哪个效率更高?对于这些例子,忽略可读性偏好的引用句子在多大程度上是正确的?
我相信如果代码中有大量的迭代和循环,第二种情况会比第一种情况产生一些性能影响。
【问题讨论】:
-
是的,第二个选项更好。这是计算机科学 101 的事情。 18 年前我参加的课程编号是 COMP 170,我仍然记得我的教授 Baird 博士解释过它(虽然不是实际的文字或推理......只是它是更好的选择)。但是,简而言之,它允许更快地收集内存,防止意外泄漏错误状态,帮助您避免命名空间中的混乱,使重要的东西脱颖而出,将名称和类型更接近它们的用途,以便更容易修改和推理.我可以继续。
-
@GrantWinney 你是对的,但我没有考虑速度和性能方面的可读性问题。
-
@JoelCoehoorn 这怎么能证明是合理的,因为声明在
timer中循环了很多次,而在第一种情况下,它只执行一次! -
编译器使差异消失。基本上,变量作为函数调用的一部分被放入堆栈,因此它实际上没有任何成本。如果你有超过一个堆栈框架可以容纳,编译器可能会将变量“提升”到私有类的单个实例。它可以使用许多许多技巧。但套用本·富兰克林的话说,如果你用一点正确性换取一点表现,那么你最终将一无所获。
-
谢谢@JoelCoehoorn。顺便说一句,我喜欢这句话。
标签: .net performance loops optimization timer