Array.map的Javascript性能
刚刚在jsperf中写了一些测试用例来测试命名函数和匿名函数之间的区别,同时使用Array.map
和其他替代方法。
http://jsperf.com/map-reduce-named-functions
(请原谅url名称,这里没有Array.reduce
的测试,我在完全决定我想测试的内容之前命名测试)
一个简单的for / while循环显然是最快的,但我仍然感到惊讶,速度比Array.map
慢10倍Array.map
......
然后我通过mozilla尝试了polyfill https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Polyfill
Array.prototype.map = 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 res = new Array(len);
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++)
{
// NOTE: Absolute correctness would demand Object.defineProperty
// be used. But this method is fairly new, and failure is
// possible only if Object.prototype or Array.prototype
// has a property |i| (very unlikely), so use a less-correct
// but more portable alternative.
if (i in t)
res[i] = fun.call(thisArg, t[i], i, t);
}
return res;
};
然后,我尝试了一个我自己编写的简单实现...
Array.prototype.map3 = function(callback /*, thisArg */) {
'use strict';
if (typeof callback !== 'function') {
throw new TypeError();
}
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0, len = this.length; i < len; i++) {
this[i] = callback.call(thisArg, this[i], i, this);
};
};
结果摘要:
从最快到最慢:
Array.map
意见
有趣的是,命名函数通常比使用匿名函数的速度快得多(大约5%)。 但是我注意到firefil的命名函数的polyfill比较慢,但是在chrome中速度更快,但是chrome自己的map实现对于命名函数来说速度更慢......我测试了这个约10倍,所以即使它不是完全密集的测试(其中jsperf已经这样做了),除非我的运气很棒,它应该足以作为指导。
此外,Chrome的map
功能比我的机器上的Firefox慢2倍。 没有想到的是。
并且... firefox自己的Array.map
实现比Mozilla Polyfill更慢......哈哈
我不确定为什么ECMA-262规范声明map
可以用于数组以外的对象(http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.19)。 这使得整个地图函数慢了3-4倍(如我的测试所示),因为您需要检查每个循环的属性存在性......
结论
如果您认为不同的浏览器执行的方式稍有不同,则命名函数和匿名函数之间没有太大的区别。
在一天结束的时候,我们不应该真的微观优化太多,但我发现这很有趣:)
首先,这不是一个公平的比较。 正如你所说,正确的JavaScript映射能够使用对象,而不仅仅是数组。 所以你基本上将两种完全不同的功能与不同的算法/结果/内部工作进行比较。
当然,正确的JavaScript映射比较慢 - 它被设计为在一个更大的域上工作,而不是一个简单的数组。
链接地址: http://www.djcxy.com/p/64161.html