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
不要过早地优化代码。编写代码,检查您的实际瓶颈在哪里并开始优化这些。
由于代码优化,微基准测试没有用。他们测试实际测试本身的性能;不是您要进行基准测试的技术。在实际生产代码中应用这些技术时,性能可能会在任何方向上发生多个数量级的变化。这实际上意味着每一次发生。在一个地方 for(;;)
循环可能更快,在其他地方 for..of
可能更好。
在我使用 AS3 期间,我了解到函数调用很昂贵优化代码的关键是内联。在 JS 中,我经常看到 Array#forEach
超过手动循环,当 JS 可以优化数组上执行的函数的 sh*t + 可以确定它可以摆脱所有安全功能(必须在后面执行场景),因为不会使用稀疏数组调用此代码,也不会以其他方式访问该数组上的未定义键。
总结:
除非您在其实际上下文中调试您的实际代码,否则您不知道它将如何实际优化;你只能估计或猜测。
而在 JS 中,内部优化器是真正快速代码的关键。不是您对代码应用的一些微优化。
我看到自 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
不要过早地优化代码。编写代码,检查您的实际瓶颈在哪里并开始优化这些。
由于代码优化,微基准测试没有用。他们测试实际测试本身的性能;不是您要进行基准测试的技术。在实际生产代码中应用这些技术时,性能可能会在任何方向上发生多个数量级的变化。这实际上意味着每一次发生。在一个地方
for(;;)
循环可能更快,在其他地方for..of
可能更好。
在我使用 AS3 期间,我了解到函数调用很昂贵优化代码的关键是内联。在 JS 中,我经常看到 Array#forEach
超过手动循环,当 JS 可以优化数组上执行的函数的 sh*t + 可以确定它可以摆脱所有安全功能(必须在后面执行场景),因为不会使用稀疏数组调用此代码,也不会以其他方式访问该数组上的未定义键。
总结:
除非您在其实际上下文中调试您的实际代码,否则您不知道它将如何实际优化;你只能估计或猜测。
而在 JS 中,内部优化器是真正快速代码的关键。不是您对代码应用的一些微优化。