Frage

Vor dem Hintergrund von C / C ++ ist das Speicherlayout von Objekten im Hinblick auf die Reduzierung von Cache-Fehlern besonders bei der Arbeit an Konsolen von entscheidender Bedeutung.Datenorientiertes Design wird häufig dem objektorientierten Design vorgezogen, um verwandte Objekte im Speicher nahe beieinander zu halten (insbesondere in leistungskritischen Bereichen).

Vor kurzem habe ich einige Javascript-Entwicklungen durchgeführt und frage mich, wie der allgemeine Konsens in der Javascript-Community ist.

Mit meiner begrenzten Erfahrung in Javascript war ich oft überrascht, völlig unerwartete Ergebnisse bei der Profilerstellung zu sehen.Das interne Speicherlayout und die Implementierung von Javascript-Objekten / -Strukturen variieren von Browser zu Browser so stark, dass ich mich frage, ob es sich lohnt, eine Optimierung zu versuchen.

Ich habe einen einfachen Testfall erstellt (http://jsperf.com/object-vs-data) auf jsPerf, um die Leistung der beiden Methoden zu vergleichen, und während es Leistungssteigerungen auf Chrome zeigt, gibt es keine merkliche Beschleunigung auf Safari.

Sollte ich mich in Javascript überhaupt mit dem Speicherlayout von Objekten beschäftigen?Oder ist es eher eine Art, es in eine Richtung zu implementieren und dann bei Bedarf zu optimieren?

Diese zweite Option scheint (in Bezug auf die Entwicklungszeit) etwas verschwenderisch zu sein, insbesondere wenn es eine gute Richtlinie zu befolgen gibt.

Dank~

Ergänzende Informationen:Dies ist im Grunde, wie ich die beiden Ansätze in Javascript implementieren würde.Der obige jsPerf-Testfall ist so implementiert.

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];
War es hilfreich?

Lösung

Sie gehen grundsätzlich davon aus, dass Objekte in Javascript wie in C ++ funktionieren.Tun sie nicht.

In C ++ besteht der Hauptzweck eines Typs darin, als "Linse" über einen Speicherblock zu fungieren.Das Klassenlayout definiert direkt den Inhalt des Speichers, den das Objekt beschreibt, auf genau definierte Weise.C / C ++ - Arrays erfordern speziell ein lineares, kontinuierliches Layout homogener Typen.

In JavaScript ist ein Objekt eine Sammlung von Name / Wert-Paaren.Ein Array ist nur ein Objekt mit einer speziellen "Längen" -Eigenschaft.Beachten Sie, dass es hier KEINE Beschreibung oder Definition des Speicherlayouts gibt.Nichts hindert einen Javascript-Interpreter daran, Arrays als Hash-Tabelle und nicht als linearen Speicherblock zu implementieren;tatsächlich bin ich mir sicher, dass es sich um JS-Implementierungen handelt, die genau das tun.

JavaScript-Implementierungen können den Speicher beliebig anordnen, und es gibt keine Entsprechung zwischen allem, was Sie in der Quelle tun, und dem, was tatsächlich auf dem Computer landet.

Darüber hinaus sind JavaScript-Arrays heterogen, nicht homogen.Das heißt, unter der Annahme, dass es in zusammenhängendem Speicher angelegt wurde, wäre Ihr äquivalenter Typ in C JSObject ** , nicht int ** (oder float ** oder was auch immer).Ein JS-Array ist eine Sammlung von Verweisen auf Daten, die an anderer Stelle gespeichert sind. Selbst wenn sich die Verweise in Ihrer Cache-Zeile befanden, sind Ihre Daten nicht vorhanden.

Also, zusammenfassend - diese Art des Denkens wird dir nichts als Schmerz bringen.JavaScript ist eine viel höhere Sprache als C ++, und ein Teil davon besteht darin, die gewohnte Kontrolle aufzugeben.Diese Art der Optimierung auf niedriger Ebene wird nach Möglichkeit vom Interpreter durchgeführt.Konzentrieren Sie sich darauf, Code mit effizienten Algorithmen zu schreiben, die Ihre Lösung auf natürliche Weise ausdrücken;das ist schon schwer genug.:-)

Andere Tipps

Okay.Mit einigen Zahlen und Testfällen herumgespielt..

Zuerst habe ich diesen Testfall erstellt http://jsperf.com/object-vs-array-creation-for-so In diesem Fall erstellen Object is viel schneller dann erstellen Sie eine Array

Zweitens habe ich diesen Testfall erstellt http://jsperf.com/accessing-speed Darin gab es kaum einen Unterschied zwischen ihnen..

Aus diesem Profil schließe ich also, dass die Verwendung von Objekten mit mehr als Arrays schneller ist, wenn das Projekt wirklich riesig..da aus dem ersten Fall klar ist, dass die Objekterstellung schneller ist als die Array-Erstellung.

Aber..

Javascript ist eine hochentwickelte und performante Sprache und Sie sollten sich mit solchen Mikrooptimierungen keine Sorgen machen.Alles, was Sie sich konzentrieren sollten, ist auf die Semantik.Sie sollten die Struktur wählen, die Ihre Absicht am besten beschreibt..

Testen in Chrome 36.0.1985.125 unter Windows NT 6.3

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top