Javascript对象与映射性能(Chrome、V8、Node JS)

Javascript对象与映射性能(Chrome、V8、Node JS),javascript,object,maps,Javascript,Object,Maps,如果我需要在大型数据集(>1000个对象)中通过字符串键进行随机查找,我试图了解是否使用JS Object或Map 我编写了一个简单的基准测试,结果显示,在Chrome(V8)中,对象的性能大约是地图的2倍。然而,我检查了其他浏览器,结果却恰恰相反。为什么它们在不同的浏览器/引擎中如此不同 我还在Node.JS中编写了一个类似的测试,但我看不到类似的结果(测试用例6比测试用例4花费的时间多得多): 测验 var now=require(“立即执行”); var mapKeyValue=新映射()

如果我需要在大型数据集(>1000个对象)中通过字符串键进行随机查找,我试图了解是否使用JS Object或Map

我编写了一个简单的基准测试,结果显示,在Chrome(V8)中,对象的性能大约是地图的2倍。然而,我检查了其他浏览器,结果却恰恰相反。为什么它们在不同的浏览器/引擎中如此不同

我还在Node.JS中编写了一个类似的测试,但我看不到类似的结果(测试用例6比测试用例4花费的时间多得多):

测验
var now=require(“立即执行”);
var mapKeyValue=新映射();
var mapStringKeyValue=新映射();
var objectKeyValue={};
var n=10000;
var testSamples=100;
var firstRow=0;
var firstRowString=firstRow+“”;
var middleRow=数学楼层(n/2);
var middleRowString=middleRow+“”;
var lastRow=n-1;
var lastRowString=lastRow+“”;
var不存在=n*2;
var nonExistString=nonExist+“”;
函数makeid(){
var text=“”;
var-mablue=“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789”;
对于(变量i=0;i<20;i++)
text+=可能的.charAt(Math.floor(Math.random()*可能的.length));
返回文本;
}
对于(变量i=0;i
结果
如果您对如何改进基准并使其更准确有任何想法,请告诉我。谢谢。

您最长的测试用例花费的时间不到0.005毫秒。电脑把它当早餐吃。你所处的领域,冷启动时间的微观波动将以相对百分比的形式彻底改变结果。这使得这些数字意义不大

我建议针对可读性和其他问题进行优化。请记住,地图是新的,随着引擎的发展,它会变得更快

以下是一些与微观基准、陷阱和改进方法相关的资源


我刚才有一个类似的问题,写了一个测试用例,第一个答案和你的相似,但是我们都不认为现代JS引擎能很好地消除与函数结果无关的代码。 这意味着您的测试用例向您显示了误导性的结果,因为JS引擎能够完全删除您的测试用例,因此您测量了引擎运行空循环的速度

我编写了一个新的测试用例,确保浏览器没有机会消除代码,结果显示贴图的速度几乎是关联对象的两倍:

请注意,此测试不包括实际初始化映射对象的成本。因此,在现实中,将局部对象用于小代码片段很可能更快,而实际映射只在全局上下文中存储大量数据的情况下更快


还值得注意的是,浏览器意识到对象上没有写操作,因此忽略了它必须执行的所有更新检查。因此,冻结的性能实际上较慢,而人们可能会期望它更快。

对于未来的搜索者,也请查看以下问题:
Test samples number 100
Test case 1 took in average 2050.269999999692 ns
Test case 2 took in average 751.2899999997202 ns
Test case 3 took in average 567.3000000004081 ns
Test case 4 took in average 727.2699999999688 ns
Test case 5 took in average 4760.029999999489 ns
Test case 6 took in average 1939.3400000004135 ns
Test case 7 took in average 673.549999999885 ns
Test case 8 took in average 689.3600000002564 ns
Test case 9 took in average 541.3700000001143 ns
Test case 10 took in average 1146.0599999999843 ns
Test case 11 took in average 3096.7699999998285 ns
Test case 12 took in average 644.7400000000058 ns