优化JavaScript循环会使其速度变慢

优化JavaScript循环会使其速度变慢,javascript,optimization,Javascript,Optimization,在《JavaScript模式》一书中,Stoyan Stefanov声称JavaScript中循环的常见方式 for (i = 0, max = myarray.length; i < max; i++) { // do something with myarray[i] } 我发现这很有趣,所以我决定在现实世界中对其进行测试,将该技术应用于中显示的性能密集型循环。可以看到比较常规代码和“优化”代码的基准测试 有趣的是,在Opera和Firefox中,所谓的优化循环实际上比常规循环慢。为

在《JavaScript模式》一书中,Stoyan Stefanov声称JavaScript中循环的常见方式

for (i = 0, max = myarray.length; i < max; i++) {
// do something with myarray[i]
}
我发现这很有趣,所以我决定在现实世界中对其进行测试,将该技术应用于中显示的性能密集型循环。可以看到比较常规代码和“优化”代码的基准测试


有趣的是,在Opera和Firefox中,所谓的优化循环实际上比常规循环慢。为什么呢?

这种微观优化的有效性总是非常有限的。虚拟机的实现很可能包括对“常用方式”的优化,这些优化超出了您在语言级别上所能做的


这就是为什么微观优化通常是浪费时间的原因。初学者往往对它们着迷,最终编写的代码很难维护,速度也很慢。

这种微优化的有效性总是非常有限的。虚拟机的实现很可能包括对“常用方式”的优化,这些优化超出了您在语言级别上所能做的


这就是为什么微观优化通常是浪费时间的原因。初学者往往对它们着迷,最终编写的代码很难维护,速度也很慢。

首先,我看不出第二个代码比第一个快多少的原因。与零比较与与另一个数字比较之间的差异可能会在编译代码中非常紧密的循环中产生差异,但即使在那里,大多数情况下也可能是货物崇拜(阅读Richard Feyman的《如果你没有得到参考,如果没有其他东西的话》这本书是一本很好的读物。也有很多次,类似的倾向是将某个很好的东西复制到一个没有真正理由认为它对编程有帮助的案例中)

我可以看到以下情况的速度变慢:

for (i = 0; i < myarray.length; i++) {
// do something with myarray[i]
}
for(i=0;i
但是我也可以看到,如果引擎为您优化了提升长度检查,或者执行过程中检查长度和检查变量的成本是相等的,那么不会变慢

我还可以看到,或者您给出的第一个代码示例,或者两者都是给定脚本引擎优化的内容——这毕竟是js中的一个非常常见的习惯用法,本质上涉及循环,因此尝试在脚本引擎中检测和优化循环是明智的

但是,除了这些猜测之外,我们不能说“因为一个引擎在该引擎中比另一个更好,这就是为什么”没有达到低于javascript的级别并检查引擎的实现。您的结果表明,每个引擎的答案都不一样(毕竟,其中一个更符合你的预期)

现在,值得注意的是,在每一种情况下,结果都非常接近。如果你发现只有一两个浏览器目前相当流行,而这些浏览器的变化确实优化了,那么它仍然是值得的

如果您对它是否值得或只是一种假设感兴趣,您可以尝试获取Netscape 2(毕竟是有史以来第一款javascript浏览器)的副本,并运行一些代码来测试该方法


编辑:如果你真的尝试这种实验,另一种是故意尝试超出数组边界1的错误循环。引擎的一种可能优化是意识到你正在遍历数组,并检查一次你将在哪里结束超出范围。如果是这样的话,如果你最终会出错,你可能会得到不同的结果。

在with中,我看不出第二个数比第一个数快多少的原因。与零比较与与与另一个数比较之间的差异可能会在编译代码中产生非常紧密的循环,但即使在那里,大多数情况下也可能是货物崇拜(阅读Richard Feyman的《如果你没有得到参考,如果没有其他东西的话》这本书是一本很好的读物。也有很多次,类似的倾向是将某个很好的东西复制到一个没有真正理由认为它对编程有帮助的案例中)

我可以看到以下情况的速度变慢:

for (i = 0; i < myarray.length; i++) {
// do something with myarray[i]
}
for(i=0;i
但是我也可以看到,如果引擎为您优化了提升长度检查,或者执行过程中检查长度和检查变量的成本是相等的,那么不会变慢

我还可以看到,或者您给出的第一个代码示例,或者两者都是给定脚本引擎优化的内容——这毕竟是js中的一个非常常见的习惯用法,本质上涉及循环,因此尝试在脚本引擎中检测和优化循环是明智的

但是,除了这些猜测之外,我们不能说“因为一个引擎在该引擎中比另一个更好,这就是为什么”没有达到低于javascript的级别并检查引擎的实现。您的结果表明,每个引擎的答案都不一样(毕竟,其中一个更符合你的预期)

现在,值得注意的是,在每一种情况下,结果都非常接近。如果你发现只有一两个浏览器目前相当流行,而这些浏览器的变化确实优化了,那么它仍然是值得的

如果您对它是否值得或只是一种假设感兴趣,您可以尝试获取Netscape 2(毕竟是有史以来第一款javascript浏览器)的副本,并运行一些代码来测试该方法

编辑:如果你真的尝试了那种