我应该相信现代浏览器能为我优化代码吗?

时间:2011-05-12 20:55:12

标签: javascript optimization

是否有JS编译器没有优化此循环?

for (var i = fromIndex; i < arr.length; i++) {  ...}

在这个criticism against Google Closure中,据说更好的循环是

for (var i = fromIndex, ii = arr.length; i < ii; i++) {  

在我熟悉的其他语言中,我相信编译器会为我做这些事情。我怀疑Google Chrome和现代浏览器会进行这些优化......我错了吗?

该文章中有更多的例子,例如长的开关案例,它们的表现很差。现在Chrome和FF 4.0仍然如此(我也听说过IE 9的好东西)?

3 个答案:

答案 0 :(得分:2)

以上例子不一样。如果你执行前者,则每次循环迭代都将检查arr.length,并且本身执行得更差。这样做的原因是让你说你有以下循环:

for (var i = 0; i < arr.length; i++) {
    arr.splice(i,1);
}

在这种情况下,arr.length无法缓存,因为它会在每次循环迭代时减小。但是,对于大多数情况,您的数组在整个循环中将保持相同的长度,因此您应该像在后一个示例中那样缓存长度,以防止额外的链查找。

答案 1 :(得分:0)

大多数浏览器针对此类内容进行优化,但无法保证。无论你真的不应该担心这种优化水平,除非你做了很多循环。

答案 2 :(得分:0)

没有。它是一个解释器而不是编译器。

JavaScript是动态的,你不能像使用静态语言那样接近尽可能多的优化。

你在JavaScript中具有类型自由并具有eval这一事实意味着普通(C ++)编译器对类似过程代码所做的大多数优化都是不安全的。

解释器的目的是尽可能快地解释您的代码并尽快运行它。

编译器的目的是使代码尽可能快。

单独注意,Chrome,FF4(5)和IE9(10)速度很快。您不需要像这样进行微观优化。虽然如果你确实遇到了瓶颈,你仍然需要手工优化简单的东西(包括循环展开)