2012-11-29 26 views
8

diesen JavaScript-Code vor:Erstellt die Zuweisung eines neuen Zeichenfolgenwerts Müll, der gesammelt werden muss?

var s = "Some string"; 
s = "More string"; 

Werden die Garbage Collector (GC) haben die Arbeiten nach dieser Art von Operation zu tun?

(Ich frage mich, ob ich über die Zuweisung Stringliterale kümmern sollte, wenn GC Pausen zu minimieren versucht.)

e: Ich bin ein wenig amüsiert, dass, obwohl ich in meiner Frage ausdrücklich erklärt, die ich brauchte um GC zu minimieren, haben alle angenommen, dass ich falsch liege. Wenn man wirklich die besonderen Details kennen muss: Ich habe ein Spiel in Javascript - es läuft gut in Chrome, aber in Firefox hat halb-häufige Pausen, die auf GC zurückzuführen sind. (Ich habe sogar mit der MemChaser-Erweiterung für Firefox überprüft, und die Pausen stimmen genau mit Garbage Collection überein.)

+3

Worry über den Garbage Collector, wenn Sie Performance-Probleme haben, und nur wirklich ernsthafte dabei. Für fast alle normalen Seiten ist das die geringste Sorge. – Pointy

+2

Während ich die Antwort trotzdem wissen wollte (weshalb ich den Kontext nicht erwähnt habe), versuche ich in diesem speziellen Fall die Leistung einer Game Engine zu verbessern. Dies ist so ziemlich der kanonische Fall, in dem Sie sich um GC kümmern müssen. – starwed

+2

Es ist wirklich gut, ein Verständnis dafür zu bekommen, wie GC zu einem frühen Zeitpunkt in einem Projekt funktioniert, damit Sie nicht mit einem großen Refaktor auf der Strecke fertig werden, wenn Sie * Probleme * haben und wenn es viel teurer ist, dies zu ändern Du machst Dinge. –

Antwort

8

Ja, Zeichenfolgen müssen wie alle anderen dynamisch zugewiesenen Objekte mit einem Garbage-Collected gesammelt werden. Und ja, das ist ein berechtigtes Problem, da unvorsichtige Zuweisung von Objekten innerhalb von ausgelasteten Schleifen definitiv Leistungsprobleme verursachen kann.

Stringwerte sind jedoch unveränderlich (nicht änderbar), und die meisten modernen JavaScript-Implementierungen verwenden "String Interning", dh sie speichern nur eine Instanz jedes eindeutigen Zeichenfolgenwerts. Dies bedeutet, dass wenn Sie so etwas haben ...

var s1 = "abc", 
    s2 = "abc"; 

... wird nur eine Instanz von "abc" zugewiesen. Dies gilt nur für String-Werte, nicht String Objekte.

Ein paar Dinge im Auge zu behalten:

  1. Funktionen wie substring, slice etc. wird ein neues Objekt für jeden Funktionsaufruf zuweisen (wenn mit unterschiedlichen Parametern aufgerufen).

  2. Obwohl beide Variablen auf die gleichen Daten im Speicher zeigen, müssen immer noch zwei Variablen verarbeitet werden, wenn der GC-Zyklus ausgeführt wird. Wenn Sie zu viele lokale Variablen haben, können Sie sich ebenfalls verletzen, da jeder von ihnen vom GC verarbeitet werden muss, was zusätzlichen Aufwand verursacht.

Einige weitere Lektüre Hochleistungs JavaScript auf das Schreiben:

+0

Danke für die Antwort. (Bei der Suche war ich natürlich schon auf alle drei dieser Links gestoßen! :)) – starwed

0

Ja, der Garbage Collector wird ein String-Objekt haben, das "Some string" enthält, um loszuwerden. Und als Antwort auf Ihre Frage wird diese String-Zuweisung für den GC funktionieren.

Da Strings unveränderlich sind und häufig verwendet werden, ist die JS-Engine sehr effizient zu handhaben. Sie sollten keine Pausen von Müll bemerken, die ein paar Strings sammeln. Der Müllsammler hat im normalen Ablauf der JavaScript-Programmierung ständig zu arbeiten. So soll es funktionieren.

Wenn Sie Pausen von GC beobachten, bezweifle ich, dass es aus ein paar Strings ist. Es ist wahrscheinlicher ein viel größeres Problem. Entweder haben Sie Tausende von Objekten, die GC benötigen oder eine sehr komplizierte Aufgabe für den GC. Wir konnten darüber nicht wirklich spekulieren, ohne den gesamten Code zu studieren.

Dies sollte kein Problem sein, es sei denn, Sie haben eine enorme Schleife und befassen sich mit Zehntausenden von Objekten. In diesem Fall könnte man etwas genauer programmieren, um die Anzahl der erstellten Zwischenobjekte zu minimieren. Aber, ohne diese Ebene von Objekten, sollten Sie zuerst klaren, zuverlässigen Code und dann für die Leistung optimieren, nur wenn etwas Ihnen gezeigt hat, dass es ein Leistungsproblem gibt, um das Sie sich kümmern müssen.

0

Ja, aber es sei denn, Sie tun dies in einer Schleife millionenfach, es wird wahrscheinlich kein Faktor sein, über den Sie sich Sorgen machen müssen.

-2

Zur Beantwortung Ihrer Frage: „Ich frage mich, ob ich über die Zuweisung Stringliterale sorgen sollten, wenn sie versuchen GC Pausen zu minimieren“: Nein

Sie wirklich brauchen keine Sorgen zu machen über diese Art der Sache in Bezug zur Müllabfuhr.

GC ist nur ein Problem bei der Erstellung & zerstören große Anzahl von Javascript-Objekten oder eine große Anzahl von DOM-Elementen.

+0

Dies ist nicht korrekt. Strings selbst sind unveränderlich. Der String "Some String" ist also ein Objekt irgendwo im JS-Speicher und muss vom GC entfernt werden, wenn es keine Referenzen mehr darauf gibt. – jfriend00

+0

Sie haben Recht, antworten aktualisiert, um zu reflektieren. –

0

Wie Sie bereits bemerkt haben, ist JavaScript nicht JavaScript. Es läuft auf verschiedenen Plattformen und hat daher unterschiedliche Leistungsmerkmale. Also die definitive Antwort auf die Frage "Wird der GC nach dieser Art von Operation arbeiten?" ist: vielleicht. Wenn das Skript so kurz ist, wie Sie es gezeigt haben, könnte ein JIT-Compiler die erste Zeichenfolge vollständig löschen. Aber in der Sprachdefinition gibt es keine Regel, die besagt, dass es so oder anders sein muss. Am Ende ist es so, als ob es allzu oft in JavaScript ist: Sie müssen es versuchen.

Die interessantere Frage könnte auch sein: Wie können Sie Garbage Collection vermeiden. Und das ist der Versuch, die Zuweisung neuer Objekte zu minimieren.Spiele haben in der Regel eine ziemlich konstante Anzahl von Objekten und oft werden keine neuen Objekte vorhanden sein, bis ein altes nicht mehr benutzt wird. Für Strings könnte dies schwieriger sein, da sie in JS unveränderlich sind. Versuchen Sie daher, Strings möglichst durch andere (veränderliche) Repräsentationen zu ersetzen.

Verwandte Themen