是否有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的好东西)?
答案 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)速度很快。您不需要像这样进行微观优化。虽然如果你确实遇到了瓶颈,你仍然需要手工优化简单的东西(包括循环展开)