【问题标题】:"Variables should be given the smallest scope". Really?“变量应该被赋予最小的范围”。真的吗?
【发布时间】: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


【解决方案1】:

一般来说,变量应该被赋予最小的作用域。

我同意。

第一次使用在代码执行速度上真的不一样吗?

不仅仅因为范围。

哪个效率更高?

如果只是范围问题,那么我希望它们编译为非常相似的 CIL,如果不完全相同,并且因此没有区别。可能会有一些小的怪癖导致一个人略微击败另一个人,但这样的怪癖可能会以任何一种方式发生。

在这种情况下,尽管范围的不同意味着没有同类的比较;方法外部的字段与内部的本地字段不同。通常,使用字段比使用本地更昂贵,但如果初始化只需要发生一次并且本身很昂贵,那么缓存(“记忆”)可以得到回报。然而,这不仅仅是范围的差异。 Scope 往往不会对性能产生明显的影响,除非它隐藏了一些东西,这也使它不像是一样的(例如,捕获的本地与未捕获的不同)。

关于这些例子,忽略可读性偏好,引用的句子在多大程度上是正确的?

引用的句子完全是关于可读性以及您从允许使用的范围中知道变量的使用范围的事实。范围越窄,就越能更好地反映意图,这是人类可读的代码应该努力的目标。

我相信如果代码中有大量的迭代和循环,第二种情况会比第一种情况产生一些性能影响。

只是因为它不仅仅是作用域,还有变量的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多