Kontext: Ich erstelle eine kleine Site, die einen RSS-Feed liest und den Feed im Hintergrund aktualisiert / überprüft. Ich habe ein Array zum Speichern der anzuzeigenden Daten und ein anderes zum Speichern der IDs der angezeigten Datensätze.
Frage: Wie viele Elemente kann ein Array in Javascript enthalten, bevor die Dinge langsam oder träge werden? Ich sortiere das Array nicht, verwende aber die inArray-Funktion von jQuery, um einen Vergleich durchzuführen.
Die Website wird weiterhin ausgeführt und aktualisiert, und es ist unwahrscheinlich, dass der Browser so oft neu gestartet / aktualisiert wird.
Wenn ich darüber nachdenken sollte, einige Datensätze aus dem Array zu löschen, was ist der beste Weg, um einige Datensätze nach einem Limit zu entfernen, z. B. 100 Elemente.
quelle
Antworten:
Die maximale Länge bis "es wird träge" hängt vollständig von Ihrem Zielcomputer und Ihrem tatsächlichen Code ab. Sie müssen also auf dieser (diesen) Plattform (en) testen, um festzustellen, was akzeptabel ist.
Die maximale Länge eines Arrays gemäß der ECMA-262 5th Edition-Spezifikation ist jedoch aufgrund der abstrakten ToUint32- Operation durch eine vorzeichenlose 32-Bit-Ganzzahl gebunden , sodass das längste mögliche Array 2 32 -1 = 4.294.967.295 = 4,29 Milliarden Elemente haben kann .
quelle
Sie müssen das Array nicht trimmen, sondern müssen es einfach als Ringpuffer (Index% maxlen) adressieren. Dadurch wird sichergestellt, dass das Limit nie überschritten wird (die Implementierung eines Ringpuffers bedeutet, dass Sie nach Erreichen des Endes wieder zum Anfang zurückkehren - das Ende des Arrays kann nicht überschritten werden).
Beispielsweise:
quelle
Sie können so etwas versuchen, um die Länge zu testen und zu kürzen:
http://jsfiddle.net/orolo/wJDXL/
quelle
Wie @maerics sagte, bestimmen Ihr Zielcomputer und Ihr Browser die Leistung.
Für einige Zahlen aus der realen Welt wird auf meinem Chromebook für Unternehmen 2017 der Vorgang ausgeführt:
x=5e4
dauert 16ms, gut genug für 60fpsx=4e6
dauert 250ms, was auffällt, aber keine große Sache istx=3e7
dauert 1300ms, was ziemlich schlecht istx=4e7
dauert 11000 ms und weist zusätzliche 2,5 GB Speicher zuRund 30 Millionen Elemente sind also eine harte Obergrenze, da die Javascript-VM bei 40 Millionen Elementen von einer Klippe fällt und den Prozess wahrscheinlich zum Absturz bringen wird.
quelle
Ich habe ein Leistungsframework erstellt, das Millionen von Datensätzen manipuliert und grafisch darstellt, und selbst dann lag die Latenz der Javascript-Berechnung in der Größenordnung von zehn Millisekunden. Ich glaube nicht, dass Sie sich Sorgen machen müssen, es sei denn, Sie machen sich Sorgen, die Grenzwerte für die Arraygröße zu überschreiten.
quelle
Es wird sehr browserabhängig sein. 100 Gegenstände klingen nicht nach einer großen Zahl - ich gehe davon aus, dass Sie viel höher gehen könnten. Tausende sollten kein Problem sein. Was ein Problem sein kann, ist der Gesamtspeicherverbrauch.
quelle
Ich habe schamlos einige ziemlich große Datensätze in den Speicher gezogen, und obwohl es träge wurde, dauerte es vielleicht 15 Mo Daten nach oben mit ziemlich intensiven Berechnungen für den Datensatz. Ich bezweifle, dass Sie Probleme mit dem Speicher haben werden, es sei denn, Sie haben intensive Berechnungen für die Daten und viele, viele Zeilen. Profiling und Benchmarking mit verschiedenen Scheinergebnismengen sind die beste Wahl, um die Leistung zu bewerten.
quelle