在阅读Quintus game engine的源代码时,我发现他们大量使用for循环而不是原生forEach。
我原来的想法是原生的forEach方法比循环的标准稍快。然而,在用these benchmarks测试我的理论之后,for循环结构似乎明显更快。
在探索之后,我似乎无法找出引擎盖下发生的事情。有谁知道巨大差异的原因?
编辑:要清楚,我问这个案子是“为什么”。我不是在问“哪个更快”。答案 0 :(得分:17)
forEach在内部包含许多检查,并不像简单的循环那样简单 有关详细信息,请参阅the Mozilla Javascript reference:
if (!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun /*, thisArg */)
{
"use strict";
if (this === void 0 || this === null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== "function")
throw new TypeError();
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++)
{
if (i in t)
fun.call(thisArg, t[i], i, t);
}
};
}
答案 1 :(得分:0)
感谢粘贴实施;那里有答案:
fun.call
比fun
慢,i in t
测试费用很高。
似乎已经非常努力地解决了不常见的案件 最终的结果对于普通用途来说太贵了。