4

我已经看到,自 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 次)中大量使用它。

你有线索吗?

4

3 回答 3

3

根据这个测试,第一个(标准 for 循环)的性能要好得多。

于 2017-08-12T14:00:32.233 回答
3

较新的语言特性起初通常表现不佳,因为它们没有得到足够的优化关注。

使用它们的人越多,它们就越有可能受到关注,所以总的来说,使用提供更好、更清晰代码的任何一个,除非你遇到性能至关重要的极端情况。

于 2017-08-12T14:04:10.850 回答
1

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

但是,正如你所看到的,它很大但是

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

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

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

概括:

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

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

于 2017-08-12T14:40:21.623 回答