Supponiamo che io abbia una funzione che devo chiamare molto, forse qualche migliaio di volte su ogni mossa del mouse o del mouse. Usa un'istanza di una funzione (classe), chiamata Transform
:
function func1(a, b, c) {
var t = new Transform();
t.rotate(a);
t.scale(b, c);
return t.m[0];
}
Quindi sto creando migliaia di nuove trasformazioni come chiamo func1
lotti.
Cosa succede se, invece di creare new Transform()
s ogni volta, ho creato un piccolo sistema per allocare trasformazioni extra solo quando necessario e riutilizzarle:
window.Util = {
_CachedTransforms: [],
tempTransform: function() {
var arr = Util._CachedTransforms;
var temp = arr.pop();
if (temp === undefined) return new Transform();
return temp;
},
freeTransform: function(temp) {
Util._CachedTransforms.push(temp);
}
}
Quindi potrei chiamare func2
:
function func2(a, b, c) {
var t = Util.tempTransform();
t.reset();
t.rotate(a);
t.scale(b, c);
var result = t.m[0];
Util.freeTransform(t);
return result;
}
Usando func2
diverse migliaia di volte, new Transform
viene sempre chiamato solo una volta. Questo potrebbe suggerire un vantaggio, ma i numeri di jsperf non sembrano suggerire alcuno.
Se vuoi vedere queste due funzioni in azione e la classe Transform, dai un'occhiata a jsperf: link
E soprattutto: link
Per simulare che si verifichi un sacco durante un evento, il mio test di jsperf fa:
var a;
for (var i = 0; i < 4000; i++) {
a += func1(1, i, 3); // vs func2
}
Potrebbero esserci modi migliori per testare se questo è vantaggioso o meno. Mi manca qualcosa?
Più in generale, il riutilizzo di oggetti come questo è ancora una buona idea in questo scenario, o mai?