Domanda

Si consideri la seguente funzione Javascript (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

Ora quello che non mi piace di questa funzione è che lo stesso identico oggetto viene creato ogni volta che la funzione viene chiamata. Dal momento che l'oggetto non cambia avrei preferito creare una sola volta. Così abbiamo potuto fare le seguenti regolazioni (2):

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

Ora l'oggetto viene creato una volta quando lo script viene caricato e memorizzato in dataObject. Ma supponiamo che setData si chiama solo occasionalmente - la maggior parte delle volte che lo script viene caricato la funzione non viene utilizzato. Quello che non mi piace di questa funzione in questo caso è che l'oggetto viene sempre creato e conservato in memoria, tra cui molte occasioni in cui non potrà mai essere utilizzato. Ho pensato che si potrebbe fare qualcosa di simile per trovare l'equilibrio ideale (3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

Volesse che senso? Immagino che dipende da quando l'interprete decide di creare un oggetto. E 'davvero aspettare fino a quando non passa la condizione !dataObject, o lo fa entrare nella funzione, cerca di essere intelligente e decide di costruire in anticipo? Forse diversi motori JavaScript hanno politiche diverse per quanto riguarda questo?

Poi, naturalmente, c'è la questione di sapere se queste ottimizzazioni avranno mai la materia nella pratica. Ovviamente questo dipende da fattori come la dimensione dell'oggetto, la velocità del motore, la quantità di risorse disponibili, ecc .. Ma in generale, quale diresti è l'ottimizzazione più significativo: da (1) a (2) o da (2) a (3)?

È stato utile?

Soluzione

La risposta è, non dovresti sapere. Gli esempi si mostrava hanno ben poca differenza tra di loro. L'unico modo che ci si mai ragionevolmente preoccupare di questo è se si ha la prova reale che un modo o nell'altro era prestazioni noticably nuocere o l'utilizzo di memoria su un particolare interprete. Fino ad allora, è compito dell'interprete di preoccuparsi di quella roba per te.

Detto questo, se si vuole veramente sapere ... provare per credere e scoprire. chiamare le diverse versioni 1.000.000 volte e vedere che differenza fa.

Crea una versione gigante dell'oggetto e vedere se questo fa un'ammaccatura. Guarda task manager. Prova diversi browser. Riferire i risultati. E 'un modo molto migliore per scoprire che solo chiedere un mucchio di cretini su internet quello che indovinare potrebbe essere il caso.

basta tenere a mente che oggetto deve essere in memoria in ogni caso, a prescindere ... come testo sorgente

Altri suggerimenti

Un nuovo oggetto deve essere creato - non può non essere, in parte perché le specifiche richiede, ma soprattutto perché il comportamento alternativa sarebbe intuitive, prendere:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

Non si aspetta davvero una nuova espressione oggetto per non effettivamente produrre l'oggetto che stai chiedendo? Perché è quello che ti sembra di volere.

In teoria si vuole solo fare:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

Il che ottenere l'effetto desiderato, anche se si dovrebbe rendersi conto che l'oggetto si sta tornando è un oggetto completamente mutabile che può essere cambiato, e tutti sarebbero condividono la stessa istanza di mutazione.

Per prima cosa, mi piacerebbe implementare in situazione # 2 e caricarlo una volta subito dopo il caricamento della pagina.

Se ci fosse un problema con velocità pagina, vorrei misurare il tempo impiegato per compiti specifici all'interno della pagina.

Se era molto costoso per creare l'oggetto (relativamente parlando), quindi vorrei trasferisco in situazione # 3.

Non c'è alcun punto in aggiunta del 'se' dichiarazione, se in realtà non si acquista nulla ... e in questo caso, la creazione di un grande oggetto / semplice è no sudore dalla schiena della CPU. Senza misure, non state ottimizzando - si sta solo tiro cieco

.

In realtà è un metodo abbastanza comune di inizializzazione cose che ho usato personalmente in C ++ e Java.

In primo luogo, questa ottimizzazione non sarà mai materia in pratica.

In secondo luogo, l'ultima funzione è esattamente come buono come la prima funzione. Be 'quasi. Nella prima suppongo che sei in balia del garbage collector, che dovrebbe distruggere il vecchio oggetto quando si riassegnano domElement.myDataProperty. Eppure, senza sapere esattamente come il garbage collector lavora sulla piattaforma di destinazione (e può essere molto diversa tra i vari browser), non si può essere sicuri che stai salvando i lavori a tutti davvero.

Prova tutti e tre in un paio di browser e scoprire che è più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top