最近有空,为了接近标准,想用 ES6的MAP,SET替换现有代码,在经过测试和资料查询后断绝了念头。 MAP,SET 的性能在大多数情况下远逊于用 Object和Array实现的相关功能。 其它人的测试: http://incaseofstairs.com/six-speed/ 测试代码如下:
- Map,可以使用任何基本类型作为Key,在某些场景可能速度会比Object快些。
/// 测试 SET和 array
var now = require("performance-now");
function randomString()
{
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for( var i=0; i < 5; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var t0, t1;
var averages = [0, 0, 0, 0 ];
var set = new Set();
var arr = [];
var map = new Map();
var obj = {};
var tmp ;
var vecSize=1000;
var testSamples = 50;
for( var tS = 0;tS < testSamples;tS++ )
{
console.log("--- samples: ",tS);
t0 = now();
for (var i=0; i < vecSize; i++) {
var val = randomString();
set.add(val);
}
t1 = now();
averages[0] += (t1 - t0 );
console.log( "set set:",t1 - t0 );
t0 = now();
for (var i=0; i < vecSize; i++) {
var val = randomString();
arr.push(val);
}
t1 = now();
averages[1] += (t1 - t0 );
console.log( "arr set:",t1 - t0 );
t0 = now();
for (var val of set) {
tmp = val;
}
t1 = now();
averages[2] += (t1 - t0 );
console.log( "set get:",t1 - t0 );
///
t0 = now();
var key;
for (key in obj) {
tmp = obj[key];
}
t1 = now();
averages[3] += (t1 - t0 );
console.log( "arr get:",t1 - t0 );
}
for (var i = 0; i < averages.length; i++) {
averages[i] /= testSamples;
console.log("Test" + (i + 1) + " average " + (averages[i] * 1000000) + " ns");
}
var now = require("performance-now");
function randomString()
{
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for( var i=0; i < 5; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var t0, t1;
var averages = [0, 0, 0, 0 ];
var map = new Map();
var obj = {};
var tmp ;
var vecSize=1000;
var testSamples = 50;
for( var tS = 0;tS < testSamples;tS++ )
{
console.log("--- samples: ",tS);
t0 = now();
for (var i=0; i < vecSize; i++) {
var key = randomString();
var val = randomString();
map.set(key,val);
}
t1 = now();
averages[0] += (t1 - t0 );
console.log( "map set:",t1 - t0 );
t0 = now();
for (var i=0; i < vecSize; i++) {
var key = randomString();
var val = randomString();
obj[key] = val;
}
t1 = now();
averages[1] += (t1 - t0 );
console.log( "object set:",t1 - t0 );
t0 = now();
for (var key of map.keys()) {
tmp = map.get(key);
}
t1 = now();
averages[2] += (t1 - t0 );
console.log( "map get:",t1 - t0 );
///
t0 = now();
var key;
for (key in obj) {
tmp = obj[key];
}
t1 = now();
averages[3] += (t1 - t0 );
console.log( "object get:",t1 - t0 );
}
for (var i = 0; i < averages.length; i++) {
averages[i] /= testSamples;
console.log("Test " + (i + 1) + " average " + (averages[i] * 1000000) + " ns");
}