Domanda

Provenendo da uno sfondo di C / C++, il layout della memoria degli oggetti per quanto riguarda la riduzione degli errori di cache è qualcosa che è fondamentale soprattutto quando si lavora su console.Il design orientato ai dati è spesso preferito rispetto al design orientato agli oggetti, al fine di aiutare a mantenere gli oggetti correlati vicini l'uno all'altro in memoria (specialmente nelle aree critiche delle prestazioni).

Recentemente, ho fatto un po ' di sviluppo Javascript e mi chiedo quale sia il consenso generale all'interno della comunità Javascript.

Con la mia limitata esperienza in Javascript, sono stato spesso sorpreso di vedere risultati completamente inaspettati durante la profilazione.Il layout della memoria interna e l'implementazione di oggetti/strutture Javascript varia così tanto da browser a browser, che mi chiedo se valga la pena tentare di ottimizzare.

Ho creato un semplice test case (http://jsperf.com/object-vs-data) su jsPerf per confrontare le prestazioni dei due metodi, e mentre mostra guadagni di prestazioni su Chrome, non c'è un notevole aumento di velocità su Safari.

In Javascript, dovrei anche preoccuparmi del layout della memoria degli oggetti?O è più di un tipo "implementarlo in un modo e quindi ottimizzare se necessario"?

Questa seconda opzione sembra un po ' dispendiosa (in termini di tempo di sviluppo), specialmente se c'è qualche buona linea guida da seguire.

Grazie~

Informazioni supplementari:Questo è fondamentalmente il modo in cui implementerei i due approcci in Javascript.Il caso di test jsPerf sopra è implementato in questo modo.

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
È stato utile?

Soluzione

Stai lavorando da un presupposto fondamentale che gli oggetti in Javascript funzionano come fanno in C++.Non lo fanno.

In C++, lo scopo principale di un tipo è quello di agire come un "obiettivo" su un pezzo di memoria.Il layout della classe definisce direttamente il contenuto della memoria che l'oggetto descrive, in modo ben definito.Gli array C / C++ richiedono specificamente un layout lineare e continuo di tipi omogenei.

In JavaScript, un oggetto è una raccolta di coppie nome/valore.Un array è solo un oggetto con una speciale proprietà "length".Si noti che NON vi è alcuna descrizione o definizione del layout di memoria qui.Non c'è nulla che impedisca a un interprete Javascript di implementare array come una tabella hash piuttosto che un blocco lineare di memoria;in effetti, sono sicuro che sono implementazioni JS che fanno proprio questo.

Le implementazioni JavaScript sono libere di disporre la memoria come vogliono, e non c'è corrispondenza tra tutto ciò che fai in source e ciò che effettivamente finisce nella macchina.

Inoltre, gli array JavaScript sono eterogenei, non omogenei.Cioè, supponendo che sia stato disposto in memoria contigua, il tuo tipo equivalente in C sarebbe JSObject **, non int ** (o float ** o qualsiasi altra cosa).Un array JS è una raccolta di riferimenti a dati memorizzati altrove, quindi anche se i riferimenti fossero nella riga della cache, i tuoi dati non lo saranno.

Quindi, in sintesi, questo tipo di pensiero ti farà guadagnare nient'altro che dolore.JavaScript è un linguaggio di livello molto più alto di C++, e parte di ciò sta rinunciando al controllo a cui sei abituato.Questo tipo di ottimizzazione di basso livello, se possibile, verrà eseguita dall'interprete.Concentrati sulla scrittura di codice con algoritmi efficienti che esprimono naturalmente la tua soluzione;e ' gia ' abbastanza difficile.:-)

Altri suggerimenti

OK.Giocherellava con alcuni numeri e casi di test..

In primo luogo ho creato questo caso di test http://jsperf.com/object-vs-array-creation-for-so In questo caso, creando Object essere molto più veloce quindi creando un Array

In secondo luogo ho creato questo caso di test http://jsperf.com/accessing-speed In questo, non c'era quasi alcuna differenza tra loro..

Quindi, quello che deduco da questo profilo è che l'uso di oggetti più di array sarà più veloce se il progetto è davvero enorme..come, dal primo caso, è chiaro che la creazione di oggetti è più veloce della creazione di array.

Ma..

Javascript è un linguaggio altamente sviluppato e performante e non dovresti preoccuparti di tali micro-ottimizzazioni.Tutto ciò che dovresti concentrarti è sul semantico.Dovresti scegliere la struttura che meglio descrive la tua intenzione..

Test in Chrome 36.0.1985.125 su Windows NT 6.3

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