Javascript JS数组对象vs JS数组对象效率和性能

Javascript JS数组对象vs JS数组对象效率和性能,javascript,performance,processing-efficiency,Javascript,Performance,Processing Efficiency,这个问题与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 el

这个问题与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()
对结果进行基准测试

启动一个计时器,可用于跟踪操作所需的时间。你 为每个计时器指定一个唯一的名称,最多可以有10000个计时器 在给定页面上运行。当您使用相同的 名称时,浏览器将输出经过的时间(以毫秒为单位) 因为计时器启动了

现在,考虑到浏览器缓存等其他因素,您可以讨论其结果的可靠性

这些是我的机器上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();
让dataMap=newmap();
常数差=1000000;
让key=null;
console.time();
对于(设i=0;i<1000000;i++){
key=`key${i}`;
set(key,[{'id':i,'name':`obj${i}`});
dataMap.get(key.push({'id':i+diff,'name':`obj${i+diff}`})
}   
console.timeEnd();
dataMap=newmap();
console.time();
对于(设i=0;i<1000000;i++){
key=`key${i}`;
set(key,{'id':[i],'name':[`obj${i}`]});
dataMap.get(key).id.push(i+diff);
dataMap.get(key.name.push(`obj${i+diff}`);
}
console.timeEnd();

或者试试看。

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

启动一个计时器,可用于跟踪操作所需的时间。你 为每个计时器指定一个唯一的名称,最多可以有10000个计时器 在给定页面上运行。当您使用相同的 名称时,浏览器将输出经过的时间(以毫秒为单位) 因为计时器启动了

现在,考虑到浏览器缓存等其他因素,您可以讨论其结果的可靠性

这些是我的机器上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();
让dataMap=newmap();
常数差=1000000;
让key=null;
console.time();
对于(设i=0;i<1000000;i++){
key=`key${i}`;
set(key,[{'id':i,'name':`obj${i}`});
dataMap.get(key.push({'id':i+diff,'name':`obj${i+diff}`})
}   
console.timeEnd();
dataMap=newmap();
console.time();
对于(设i=0;i<1000000;i++){
key=`key${i}`;
set(key,{'id':[i],'name':[`obj${i}`]});
dataMap.get(key).id.push(i+diff);
dataMap.get(key.name.push(`obj${i+diff}`);
}
console.timeEnd();

或者试试。

这两种方法都会产生不同的输出,因此这取决于您以后打算如何使用此数组。@gurvinder372这是我之前所想的。但是如何确定每种方法的性能呢?@Buddhika:性能不是问题。这取决于什么对你来说更容易使用。这主要是基于观点。你想解决什么问题,@Buddhika?只要选择两种方法中的一种,任何适合你的方法都可以。没有更好的。我同意@Cerbrus,这当然取决于你以后打算如何处理这些数据。在我看来,数组通常更好,但也可能有对象更好的情况。这两种方法都会产生不同的输出,因此这取决于您以后打算如何使用此数组。@gurvinder372这是我之前所想的。但是如何确定每种方法的性能?@Buddhika:性能不是问题。这取决于什么对你来说更容易使用。这主要是基于观点。你想解决什么问题,@Buddhika?只要选择两种方法中的一种,任何适合你的方法都可以。没有更好的。我同意@Cerbrus,这当然取决于你以后打算如何处理这些数据。在我看来,数组通常更好,但在某些情况下,对象可能更好。因此,基本上,“使用对你来说最容易的东西”,这是一种典型的“主要基于观点”回答。@Cerburs我相信这个问题没有提供足够的信息来回答它,因为我们不知道我们使用的数据会如何。那么,为什么你回答了一个不能正确回答的问题?因为我相信答案至少解决了问题的“哪一个更有效”部分。我们不知道“欠”OP一个答案。尤其不是关于两种有效的做事方法之间的微不足道的性能差异。因此,基本上,“使用对你来说最容易的方法”,这是典型的“主要基于观点”“回答。@Cerburs我认为这个问题没有提供足够的信息来回答它,因为我们不知道这些数据将如何使用。那么为什么你回答了一个不能正确回答的问题?因为我相信答案至少解决了问题中“哪一个更有效”的部分。我们不知道“欠”OP一个答案,特别是两种有效的做事方法之间的性能差异。