Questo può sembrare un punto particolarmente oscuro, tuttavia sto tentando di migliorare il mio radicamento nella lingua Javascript nel suo insieme (in particolare le sue migliori e più efficienti pratiche).Perché la definizione delle funzioni del prototipo JS è più rapida rispetto a un dizionario?
Mentre testare una teoria in http://jsperf.com/ mi si avvicinò con alcuni risultati strani:
Supponiamo di avere due prototipi "identici", definiti come segue:
Object1
var Object1 = function() {}
Object1.prototype.defaults = {
radius: 400,
up: 1
}
Object1.prototype.centerOffset = function() {
return this.defaults.radius*this.defaults.up;
}
Object2
var Object2 = function() {}
Object2.prototype = {
defaults: {
radius: 400,
up: 1
},
centerOffset: function() {
return this.defaults.radius*this.defaults.up;
}
}
Object1 ha un consistente (se marginale: ~ 3%) la velocità vantaggio rispetto Object2 quando si eseguono le seguenti semplici operazioni:
var o = new Object1();
var offset = o.centerOffset();
&
var o = new Object2();
var offset = o.centerOffset();
È possibile eseguire i test te stesso here. Sto usando Chrome 25 su OSX 10.6.8.
Quello che vorrei sapere è questo:
- Qual è la ragione (s) di questa differenza di prestazioni?
- Questa performance è indicativa di alcune buone pratiche in javascript?
Grazie in anticipo ragazzi.
EDIT: Grazie per le risposte - come alcuni hanno menzionato, ulteriori test da parte mia sembrano suggerire che questo problema è browser (o piuttosto, compilatore JavaScript specifico). Ho testato anche in Safari, IE 10 e Firefox. IE 10 e Firefox hanno entrambi dato risultati così vicini da non essere diversi. Safari ha eseguito le operazioni su Object2 leggermente più velocemente di quelle su Object1 (circa il 2% in media). Mi piacerebbe sapere qual è il valore anomalo (Altro), poiché la differenza di prestazioni in quel caso sembra essere sostanziale.
Probabilmente è solo indicativo di qualche stranezza del V8. – delnan
Ho avuto il risultato opposto eseguendo firefox –
Affascinante, quindi il suo compilatore specifico ... Farò qualche altro test del browser e riferirò. –