Wann Float32Array statt Array in JavaScript
Wann macht es Sinn, eine Float32Array
anstelle eines standard-JavaScript - Array
für browser-Anwendungen?
Diese performance-test zeigt Float32Array
im Allgemeinen langsamer und wenn ich das richtig verstehe ist ein standard Array
speichert zahlen als 64-bit - es gibt also keinen Vorteil in der Genauigkeit.
Abgesehen von möglichen performance-hit Float32Array
hat auch den Nachteil der Lesbarkeit - mit einem Konstruktor:
a = new Float32Array(2);
a[0] = 3.5;
a[1] = 4.5;
stattdessen ein array-literal
a = [3.5, 4.5];
Ich Frage das, denn ich bin mit der Bibliothek glMatrix die standardmäßig auf Float32Array
- und Frage mich, ob es irgendeinen Grund, warum ich nicht die Kraft, es zu verwenden Array
stattdessen wird mir erlauben, verwenden Sie array-Literale.
- Ich finde keine Website, die Antworten, meine Vermutung ist, das der Hauptvorteil ist, dass es weniger Speicher verbraucht. Also, wenn Sie die Arbeit mit großen floating-point-arrays, könnte es ein Vorteil sein.
- Es wurde eine Sprache-Anschluss zu JavaScript und Float32Array war der nächste, um unabhängig von der Quellsprache zur Verfügung hatte.
- Typisiertes Array-Spezifikation helfen kann: "Diese Spezifikation stellt eine API für die Interoperabilität mit nativen binary data".
- Sie können immer noch literal-style syntax:
new Float32Array([3.5, 4.5])
.Float32Array
ist deutlich langsamer alsFloat64Array
da die Werte umgewandelt werden müssen/aus 64-bit-Werte, wenn Sie etwas mit dem array Inhalt, so dass, wenn der Speicherplatz es zulässt, und Sie wollen Geschwindigkeit, versuchenFloat64Array
statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich per E-Mail die Entwickler von
glMatrix
und meine Antwort weiter unten umfasst seine Kommentare (Punkte 2 & 3):Anlegen eines neuen Objekts wird in der Regel schneller mit
Array
alsFloat32Array
. Die Verstärkung ist wesentlich für kleine Felder, aber weniger (umgebungsabhängig) mit größeren arrays.Zugriff auf Daten aus der TypedArray-Klasse (zB.
Float32Array
) ist oft schneller als aus einem normalen array, was bedeutet, dass die meisten array-Operationen (abgesehen von der Erstellung eines neuen Objekts) sind schneller mit TypedArrays.Als auch erklärt, durch @emidander,
glMatrix
wurde entwickelt in Erster Linie für WebGL, die verlangt, dass die Vektoren und Matrizen übergeben werdenFloat32Array
. Also, für eine WebGL-Anwendung, die potenziell kostspielige Umwandlung vonArray
zuFloat32Array
einbezogen werden müssten, in jeder performance-Messung.So, nicht überraschend, die beste Wahl ist abhängig von der Anwendung:
Wenn arrays sind in der Regel klein und/oder die Anzahl der Operationen an Ihnen ist so niedrig, dass der Konstruktor immer ist ein beträchtlicher Anteil des Arrays Lebensdauer, verwenden Sie
Array
.Wenn die Lesbarkeit des Codes ist wichtiger als die Leistung, dann verwenden Sie
Array
(D. H. mit[]
anstelle eines Konstruktors).Wenn die arrays sehr groß sind, und/oder sind für viele Operationen, dann verwenden Sie eine der TypedArray-Klasse.
Für WebGL-Anwendungen (oder anderen Anwendungen, die sonst erfordern würde ein Typ-Konvertierung), verwenden Sie
Float32Array
(oder andere TypedArray-Klasse).Ich würde davon ausgehen, dass die glMatrix-Bibliothek verwendet Float32Array, denn es ist vor allem in der WebGL-Anwendungen, bei denen Matrizen dargestellt, die als Float32Arrays (http://www.khronos.org/registry/webgl/specs/1.0/#5.14.10).