Javascript 简单的 for 循环与 for...of 的表现

Javascript simple for loop versus for...of performances

我看到自 ECMA 6 以来我们可以使用 for...of 而不是传统的 for 循环:

for( let i = 0 ; i < arr.length ; i++ ) {
    var elm = arr[i];
    // do stuff
}

VS

for( let elm of arr ) {
    // do stuff
}

你有没有看到第二个更易读、更简单、更易于维护!

我只是想知道第二种语法的性能如何,因为我需要在游戏的渲染循环(每秒 60 次)中大量使用它。

你有线索了吗?

第一个(标准 for 循环)表现得更好 according to this test

较新的语言功能通常一开始表现不佳,因为它们没有得到足够的关注以进行优化。

使用它们的人越多,他们就越有可能受到关注,因此总的来说,请使用提供更好、更清晰代码的那个,除非你有 极端 性能不佳的情况至关重要。

一般来说,for..of会比for(;;)慢,循环一个数组。因为它处理 Iterators/Generators,与递增变量并将其与其他值进行比较相比,这涉及一些开销。

BUT,正如你所看到的,它是一个很大的 but

  1. 不要过早地优化代码。编写代码,检查您的实际瓶颈在哪里并开始优化这些。

  2. 由于代码优化,微基准测试没有用。他们测试实际测试本身的性能;不是您要进行基准测试的技术。在实际生产代码中应用这些技术时,性能可能会在任何方向上发生多个数量级的变化。这实际上意味着每一次发生。在一个地方 for(;;) 循环可能更快,在其他地方 for..of 可能更好。

在我使用 AS3 期间,我了解到函数调用很昂贵优化代码的关键是内联。在 JS 中,我经常看到 Array#forEach 超过手动循环,当 JS 可以优化数组上执行的函数的 sh*t + 可以确定它可以摆脱所有安全功能(必须在后面执行场景),因为不会使用稀疏数组调用此代码,也不会以其他方式访问该数组上的未定义键。

总结:

除非您在其实际上下文中调试您的实际代码,否则您不知道它将如何实际优化;你只能估计或猜测。

而在 JS 中,内部优化器是真正快速代码的关键。不是您对代码应用的一些微优化。