这个关于javascript语言的问题。
简单地认为我们有一张地图,我们按照以下方式插入项目

var dataMap=new Map();

//First Mechanism
//firstly we can think of structure of values of map can be JSONArray of objects
 dataMap.set("key1",[{'id':12,'name':"obj1"}]); // init
// and,then insert  new element to JSON Array which holds by map using 'key1'
dataMap.get("key1").push({'id':23,'name':"obj47"});//updated, now value of 'key1' is an JSON array which holds two elements
// expect 'key1' ->   [{'id':12,'name':"obj1"},{'id':23,'name':"obj47"}]

//Second mechanism
// next we cant think of structure of values of map as JSONObject of Arrays
dataMap.set("key1",{'id':[12],'name':["obj1"]}); // init
// then we proceed with update operations like this
dataMap.get("key1").id.push(23);
dataMap.get("key1").name.push("obj47"); // two operations to insert items to respective arrays.
// expect 'key1' ->{'id':[12,23],'name':["obj1","obj47"]}


哪种方法最有效?

认为我们要映射大量的插入操作,如果我们要提高性能,哪个更好?

(如果我做错了,请更正,我想尽可能简化问题,这就是为什么)
谢谢。

最佳答案

出于好奇,我继续使用console.time()基准测试结果。


  启动一个计时器,您可以使用该计时器来跟踪操作需要多长时间。您
  给每个计时器一个唯一的名称,最多可以有10,000个计时器
  在给定页面上运行。当您以相同的方式调用console.timeEnd()时
  名称,浏览器将输出经过的时间(以毫秒为单位)
  自计时器启动以来。


现在,您可以考虑考虑其他因素(例如浏览器缓存等)来讨论其结果的可靠性。

这些是我的计算机上进行1000000次操作的结果*。

Chrome Version 61.0.3163.91 (Official Build) (64-bit)

// 1st run
default: 2217.048095703125ms
default: 3032.159912109375ms
// 2nd run
default: 1948.16796875ms
default: 3320.7431640625ms
// 3rd run
default: 2177.461181640625ms
default: 2989.448974609375ms


Firefox 55.0.3 (32-bit)

// 1st run
default: 2146.64ms
default: 2390.11ms
// 2nd run
default: 1863.7ms
default: 2264.02ms
// 3rd run
default: 1751.7ms
default: 2283.6ms


您会看到差异并不大,也不应该成为影响您决策的因素。正如@Nina Scholz非常正确地提到的那样,选择使您的生活更加轻松的数据结构。

[*]在基准测试中用作参考的代码:

let dataMap = new Map();
const diff = 1000000;
let key = null;

console.time();
for(let i = 0; i < 1000000; i++){
    key = `key${i}`;
    dataMap.set(key, [{'id': i, 'name': `obj${i}`}]);
    dataMap.get(key).push({'id': i + diff, 'name': `obj${i + diff}`})
}
console.timeEnd();

dataMap = new Map();

console.time();
for(let i = 0; i < 1000000; i++){
    key = `key${i}`;
    dataMap.set(key, {'id':[i], 'name': [`obj${i}`]});
    dataMap.get(key).id.push(i + diff);
    dataMap.get(key).name.push(`obj${i + diff}`);
}
console.timeEnd();


或尝试online

09-17 03:48