JSON Parse / Stringify的性能

时间:2018-06-22 16:12:43

标签: javascript json parsing

我想在sessionStorage中最多存储约1万个整数。我将需要JSON解析和字符串化以更新此整数数组。

这是一个可怕的主意吗?还是性能表现不太差?

4 个答案:

答案 0 :(得分:2)

您不应出于此目的使用SessionStorage,因为它会阻塞可能导致应用程序挂起的主线程。

改为选择IndexedDb

它设计为异步且速度更快。而且它也有很好的支持:

enter image description here https://caniuse.com/#search=indexeddb

希望这会有所帮助

答案 1 :(得分:1)

正如@IrkenInvader所说,在您的参考浏览器上进行测试和测量(例如,在低端移动设备上解析可能会慢得多)。

快速测试:

function getRandomInt(max) {
  return Math.floor(Math.random() * Math.floor(max));
}
var numbers = Array.apply(null, {length: 10000}).map(Function.call, (x) => getRandomInt(100));
var start = window.performance.now();
window.sessionStorage.setItem('test', JSON.stringify(numbers));
var end = window.performance.now();
console.log("timing", end-start);

答案 2 :(得分:0)

这可能取决于JSON模块的浏览器实现以及更多其他因素。根据我在Chrome中进行的测试,JSON.stringifyArray.join快得多-但在解析时,String.split似乎更快。只要您可以依赖数组内容为唯一数字,就可以String.slice(-1, 1) JSON字符串然后将其拆分。

// Generate 10k/1m numbers in a range of 100 to 300 mio
let intsTK = [], intsM = [], min = 100000000, max = 300000000
for(let i = 0; i < 1000000; i++) {
  let r = Math.random() * (max - min) + min
  if(i < 10000) intsTK.push(r);
  intsM.push(r);
}

function toJSON(array) {
  return JSON.stringify(array);
}

function fromJSON(string) {
  return JSON.parse(string);
}

function toJoined(array) {
  return array.join(",");
}

function fromJoined(string) {
  return string.split(",");
}

function fromJSONJoined(string) {
  return string.slice(1, -1).split(",");
}

// With 10K
console.time('toJSON_10k');
let jsonTK = toJSON(intsTK);
console.timeEnd('toJSON_10k');

console.time('toJoined_10k');
let joinedTK = toJoined(intsTK);
console.timeEnd('toJoined_10k');

console.time('fromJSON_10k');
fromJSON(jsonTK);
console.timeEnd('fromJSON_10k');

console.time('fromJoined_10k');
fromJoined(joinedTK);
console.timeEnd('fromJoined_10k');

console.time('fromJSONJoined_10k');
fromJSONJoined(jsonTK);
console.timeEnd('fromJSONJoined_10k');

//With 1 million
console.time('toJSON_1m');
let jsonM = toJSON(intsM);
console.timeEnd('toJSON_1m');

console.time('toJoined_1m');
let joinedM = toJoined(intsM);
console.timeEnd('toJoined_1m');

console.time('fromJSON_1m');
fromJSON(jsonM);
console.timeEnd('fromJSON_1m');

console.time('fromJoined_1m');
fromJoined(joinedM);
console.timeEnd('fromJoined_1m');

console.time('fromJSONJoined_1m');
fromJSONJoined(jsonM);
console.timeEnd('fromJSONJoined_1m');

答案 3 :(得分:0)

您可以看一下此页面: http://jsben.ch/wQ9RU 如您所见,它是提高Javascript性能的工具,使用[].splice()JSON.parse/JSON.stringify