这个问题几乎是无效的,因为 jsperf 被破坏了,无论出于何种原因,它都会扭曲结果。当我制作自己的地图实现(基于整数的地图)时,我亲自检查了它。
这两种方法完全没有区别。
顺便说一句,我认为这是使用相同语法创建空对象的更简单方法:
var EmptyV2 = function() { return Object.create(null); };
我编写了自己的小测试,打印出创建这 3 种方法的任意数量的时间。
这里是:
<!DOCTYPE html>
<html>
<head>
<style>
html
{
background-color: #111111;
color: #2ECC40;
}
</style>
</head>
<body>
<div id="output">
</div>
<script type="text/javascript">
var Empty = function(){};
Empty.prototype = Object.create(null);
var EmptyV2 = function() { return Object.create(null); };
var objectCreate = Object.create;
function createEmpties(iterations)
{
for(var i = 0; i < iterations; i++)
{
var empty = new Empty();
}
}
function createEmptiesV2(iterations)
{
for(var i = 0; i < iterations; i++)
{
var empty = new EmptyV2();
}
}
function createNullObjects(iterations)
{
for(var i = 0; i < iterations; i++)
{
var empty = objectCreate(null);
}
}
function addResult(name, start, end, time)
{
var outputBlock = document.getElementsByClassName("output-block");
var length = (!outputBlock ? 0 : outputBlock.length) + 1;
var index = length % 3;
console.log(length);
console.log(index);
var output = document.createElement("div");
output.setAttribute("class", "output-block");
output.setAttribute("id", ["output-block-", index].join(''));
output.innerHTML = ["|", name, "|", " started: ", start, " --- ended: ", end, " --- time: ", time].join('');
document.getElementById("output").appendChild(output);
if(!index)
{
var hr = document.createElement("hr");
document.getElementById("output").appendChild(hr);
}
}
function runTest(test, iterations)
{
var start = new Date().getTime();
test(iterations);
var end = new Date().getTime();
addResult(test.name, start, end, end - start);
}
function runTests(tests, iterations)
{
if(!tests.length)
{
if(!iterations)
{
return;
}
console.log(iterations);
iterations--;
original = [createEmpties, createEmptiesV2, createNullObjects];
var tests = [];
for(var i = 0; i < original.length; i++)
{
tests.push(original[i]);
}
}
runTest(tests[0], 10000000000/8);
tests.shift();
setTimeout(runTests, 100, tests, iterations);
}
runTests([], 10);
</script>
</body>
</html>
对不起,有点生硬。只需将其粘贴到 index.html 中并运行。我认为这种测试方法远远优于jsperf。
这是我的结果:
|createEmpties| 开始:1451996562280 --- 结束:1451996563073 --- 时间:793
|createEmptiesV2| 开始:1451996563181 ---结束:1451996564033 ---时间:852
|createNullObjects| 开始:1451996564148 ---结束:1451996564980 ---时间:832
|createEmpties| 开始:1451996565085 --- 结束:1451996565926 --- 时间:841
|createEmptiesV2| 开始:1451996566035 ---结束:1451996566863 ---时间:828
|createNullObjects| 开始:1451996566980 ---结束:1451996567872 ---时间:892
|createEmpties| 开始:1451996567986 --- 结束:1451996568839 --- 时间:853
|createEmptiesV2| 开始:1451996568953 --- 结束:1451996569786 --- 时间:833
|createNullObjects| 开始:1451996569890 ---结束:1451996570713 ---时间:823
|createEmpties| 开始:1451996570825 --- 结束:1451996571666 --- 时间:841
|createEmptiesV2| 开始:1451996571776 --- 结束:1451996572615 --- 时间:839
|createNullObjects| 开始:1451996572728 ---结束:1451996573556 ---时间:828
|createEmpties| 开始:1451996573665 --- 结束:1451996574533 --- 时间:868
|createEmptiesV2| 开始:1451996574646 ---结束:1451996575476 ---时间:830
|createNullObjects| 开始:1451996575582 ---结束:1451996576427 ---时间:845
|createEmpties| 开始:1451996576535 --- 结束:1451996577361 --- 时间:826
|createEmptiesV2| 开始:1451996577470 --- 结束:1451996578317 --- 时间:847
|createNullObjects| 开始:1451996578422 ---结束:1451996579256 ---时间:834
|createEmpties| 开始:1451996579358 --- 结束:1451996580187 --- 时间:829
|createEmptiesV2| 开始:1451996580293 ---结束:1451996581148 ---时间:855
|createNullObjects| 开始:1451996581261 ---结束:1451996582098 ---时间:837
|createEmpties| 开始:1451996582213 --- 结束:1451996583071 --- 时间:858
|createEmptiesV2| 开始:1451996583179 ---结束:1451996583991 ---时间:812
|createNullObjects| 开始:1451996584100 ---结束:1451996584948 ---时间:848
|createEmpties| 开始:1451996585052 ---结束:1451996585888 ---时间:836
|createEmptiesV2| 开始:1451996586003 --- 结束:1451996586839 --- 时间:836
|createNullObjects| 开始:1451996586954 ---结束:1451996587785 ---时间:831
|createEmpties| 开始:1451996587891 --- 结束:1451996588754 --- 时间:863
|createEmptiesV2| 开始:1451996588858 ---结束:1451996589702 ---时间:844
|createNullObjects| 开始:1451996589810 ---结束:1451996590640 ---时间:830