Frage

Betrachten Sie die folgende Javascript-Funktion (1):

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

Nun, was Ich mag es nicht über diese Funktion ist, dass genau die gleiche Objekt jedes Mal erstellt wird die Funktion aufgerufen wird. Da das Objekt, das ich eher es nur einmal schaffen würde nicht ändert. So konnten wir die folgenden Einstellungen (2) machen:

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

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

Nun wird das Objekt einmal erstellt, wenn das Skript geladen wird und in dataObject gespeichert. Aber nehmen wir an, dass setData nur gelegentlich genannt wird - die meisten der Zeit, dass das Skript die Funktion geladen wird, wird nicht verwendet. Was ich in diesem Fall nicht über diese Funktion gefällt, ist, dass das Objekt immer im Speicher erzeugt und gehalten wird, darunter auch viele Gelegenheiten, in denen es nie verwendet werden. Ich dachte, Sie so etwas tun könnte die ideale Balance (3) zu schlagen:

var dataObject;

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

Würde das Sinn machen? Ich meine, es hängt davon ab, wenn der Interpreter entscheidet, ein Objekt zu erstellen. Wartet es wirklich, bis er die !dataObject Zustand geht, oder hat er die Funktion eingeben, versucht, schlau zu sein und beschließt, sie im Voraus zu konstruieren? Vielleicht verschiedene Javascript-Motoren haben unterschiedliche Richtlinien im Hinblick auf das?

Dann gibt es natürlich die Frage, ob diese Optimierungen werden jemals in der Praxis wichtig ist. Offensichtlich ist dies hängt von Faktoren wie die Größe des Objekts, die Drehzahl des Motors, die Höhe der zur Verfügung stehenden Ressourcen, etc .. Aber im Allgemeinen, was würden Sie sagen, ist die bedeutendere Optimierung: von (1) bis (2) oder (2) bis (3)?

War es hilfreich?

Lösung

Die Antwort ist, dass Sie nicht wissen sollte. Die Beispiele, die Sie zeigte sehr wenig Unterschied zwischen ihnen. Der einzige Weg, würden Sie jemals vernünftig kümmern, wenn SieFormal konkrete Beweise vorgelegt hat, dass eine oder andere Weise noticably verletzende Leistung oder Speichernutzung auf einem bestimmten Dolmetscher war. Bis dahin ist es die Aufgabe des Dolmetschers über das Zeug für Sie zu sorgen.

Das heißt, wenn Sie wirklich wissen wollen ... Probieren Sie es aus und finden Sie heraus. Rufen Sie die verschiedenen Versionen 1.000.000 mal und sehen, welchen Unterschied es macht.

Erstellen Sie eine riesige Version des Objekts und sehen, ob das eine Delle macht. Beobachten Sie den Task-Manager. Probieren Sie verschiedenen Browser. Schreiben Sie die Ergebnisse zurück. Es ist ein viel besserer Weg, um herauszufinden, als nur ein paar Zuckungen im Internet zu fragen, was sie denkt, der Fall sein könnte.

nur im Kopf behalten, die ohnehin in Erinnerung sein Objekt hat, und zwar unabhängig ... als Quelltext

Andere Tipps

Ein neues Objekt erstellt werden muss - es kann nicht nicht sein, teilweise, weil die Spezifikation erfordert, sondern vor allem, weil alternatives Verhalten wäre unlogisch, nehmen Sie:

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"

Erwarten Sie wirklich ein neues Objekt Ausdruck eigentlich nicht produzieren das Objekt, das Sie fragen sind? Denn das ist, was Sie scheinen zu wollen.

Verständlicherweise möchten Sie gerade tun:

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

Welche wäre die Wirkung erhalten Sie, obwohl Sie müßten erkennen, dass das Objekt, das Sie Rückkehr ein ganz veränderbares Objekt ist, das geändert werden kann, und jeder, dass gleiche Mutieren Instanz teilen würde.

Als erstes würde ich es in Situation # 2 implementieren und laden Sie es einmal, unmittelbar nachdem die Seite geladen wird.

Wenn es ein Problem mit der Seitengeschwindigkeit ist, würde ich die Zeit für bestimmte Aufgaben innerhalb der Seite genommen messen.

Wenn es sehr teuer ist das Objekt zu erstellen (relativ gesehen), dann würde ich auf Situation # 3 bewegen.

Es gibt keinen Punkt in dem Hinzufügen der ‚if‘ Anweisung, wenn es wirklich Sie nicht kauft nichts ... und in diesem Fall ein einfaches / big-Objekt erstellen ist kein Schweiß von Ihrer CPU zurück. Ohne Messungen sind die Optimierung Sie nicht - Sie schießen blinder nur

.

Es ist eigentlich eine ziemlich gängige Methode, Dinge zu initialisieren, die ich persönlich in C verwendet habe ++ und Java.

Als erstes wird diese Optimierung in der Praxis nie wichtig.

Zweitens ist die letzte Funktion genau so gut wie die erste Funktion. Naja fast. Im ersten nehme ich Sie auf die Gnade des Garbage Collector sind, die das alte Objekt zerstören sollten, wenn Sie domElement.myDataProperty neu zuweisen. Dennoch, ohne genau zu wissen, wie der Garbage Collector auf der Zielplattform funktioniert (und es kann in allen Browsern sehr unterschiedlich sein), können Sie nicht sicher sein, Sie Arbeiten überhaupt wirklich sind zu speichern.

Versuchen Sie, alle drei von ihnen in ein paar Browsern und herauszufinden, welche schneller ist.

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