Je veux stocker un maximum d'environ 10 000 entiers dans sessionStorage. J'aurai besoin d'analyser et de coder JSON pour mettre à jour ce tableau d'entiers.
Est-ce une idée terrible? Ou est-ce que la performance a frappé pas trop mal?
Vous ne devez pas utiliser SessionStorage à cette fin car il bloque le thread principal, ce qui peut entraîner le blocage de votre application.
Vérifiez IndexedDb à la place
Il a été conçu pour être asynchrone et plus rapide. Et aussi, il a un joli support:
https://caniuse.com/#search=indexeddb
J'espère que cela t'aides
Comme @IrkenInvader a déclaré test et mesure sur votre navigateur de référence (par exemple, l'analyse des appareils mobiles bas de gamme peut être beaucoup plus lente).
Un test rapide:
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);
Vous pouvez consulter cette page: http://jsben.ch/wQ9RU C'est un outil de performance Javascript, comme vous pouvez le voir ici, utiliser [].splice()
est meilleur que JSON.parse/JSON.stringify
Cela dépendra probablement de la mise en oeuvre du module JSON par le navigateur et de bien d’autres facteurs encore. De mes tests dans Chrome, JSON.stringify
sera beaucoup plus rapide que Array.join
- mais lors de son analyse, String.split
semble être plus rapide. Tant que vous pouvez vous fier au contenu du tableau comme étant exclusivement des nombres, vous pouvez simplement String.slice(-1, 1)
la chaîne JSON, puis la scinder.
// 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');