【问题标题】:Javascript for loop efficiency提高循环效率的 Javascript
【发布时间】:2012-07-29 22:58:11
【问题描述】:

for (var i=0, cols=columns.length; i<cols; i++) { ... }

更有效率
for (var i=0; i<columns.length; i++) { ... }

?

在第二个变体中,每次检查条件i&lt;columns.length 时是否计算columns.length

【问题讨论】:

  • 警告:确保 cols 是用 var函数内部 声明的。除非两者都如此,否则 JavaScript 可能会将其视为全局变量(从而使访问速度变慢)。基于 WebKit 的浏览器几乎忽略了全局范围内的 var,即使所讨论的变量与全局变量冲突(例如 status)。
  • @Joey Adams:'var i=0, cols=columns.length` 会将 cols 声明为 var,对吗?

标签: javascript


【解决方案1】:

for 第二部分中的任何表达式将在每个循环中计算一次。

所以,在这里,对于您的第二个命题,是的,columns.length 将在每次检查条件时计算 - 这将使第一个命题比第二个命题更快。


(顺便说一句,许多其他语言也是如此)

【讨论】:

  • 这并没有说明智能 JS 运行时是否可以优化它。
  • 在 Chrome 和 Firefox 中尝试过(目前两者都使用动态编译),在两者中,使用局部变量缓存 columns.length 比在循环中使用 columns.length 更快。
  • @Joey Adams:只是出于好奇,它的速度有多快?在大多数情况下,您会将这种事情归类为过早优化吗?
【解决方案2】:

除非您已经测试并发现循环性能是一个问题,否则像这样的微优化在 Javascript 这样的语言中没有多大意义。

但是,columns.length 必须在每次迭代时计算,因为在循环迭代期间列数可能会发生变化。因此存储循环限制可能会带来更好的性能(但请参阅我的第一点)。

【讨论】:

    【解决方案3】:

    缓存版本更快,但第二个版本更安全。

    如果您只是想知道哪种循环类型最快,您可能想看看:http://blogs.oracle.com/greimer/resource/loop-test.html

    【讨论】:

    • 链接很棒!用经验数据回答这个问题。
    【解决方案4】:

    请注意,这些循环中的大多数都需要在循环中添加一条语句才能从数组中实际检索第 i 个元素。您可以避免这种情况并使用以下变体获得一个非常快速的循环,这利用了 Javascript 仅返回 undefined(其计算结果为 false)这一事实,如果您访问具有越界索引的数组(而不是引发错误) ):

    for (var i = 0, col; col = columns[i]; ++i) { ... }

    显然,如果您正在遍历一个包含评估为假的元素的数组,这将不起作用。

    【讨论】:

      【解决方案5】:

      是的,是的。访问长度属性会浪费不必要的时间(除非数组的长度在迭代过程中会发生变化。)。

      这是我循环数组的方式:http://gist.github.com/339735

      【讨论】:

        猜你喜欢
        • 2015-10-08
        • 2019-11-06
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2019-10-11
        相关资源
        最近更新 更多