2013-04-04 8 views
30

Kiedy ma sens używanie Float32Array zamiast standardowego JavaScript Array dla aplikacji przeglądarkowych?Kiedy używać Float32Array zamiast Array w JavaScript

Ten pokazuje, że Float32Array jest generalnie wolniejszy - i jeśli dobrze rozumiem, standard Array przechowuje liczby jako 64-bitowe - więc nie ma żadnej przewagi w precyzji.

Oprócz ewentualnego trafienia wydajności, Float32Array ma również tę wadę, czytelność - konieczności użycia konstruktora:

a = new Float32Array(2); 
a[0] = 3.5; 
a[1] = 4.5; 

zamiast tablicę dosłownego

a = [3.5, 4.5]; 

Pytam, bo to "Używam biblioteki glMatrix, która domyślnie jest Float32Array - i zastanawiam się, czy jest jakikolwiek powód, dla którego nie powinienem zmuszać go do używania Array zamiast tego, co pozwoli mi używać literałów tablicowych.

+0

Nie mogę znaleźć żadnej strony, która odpowiada na to, domyślam się, że główną korzyścią jest to, że zużywa ona mniej pamięci. Więc jeśli pracujesz z wielkimi tablicami zmiennoprzecinkowymi, może to być korzystne. – Barmar

+0

Być może był to port języka JavaScript, a Float32Array był najbliższy dostępnemu językowi źródłowemu. –

+2

Specyfikacja [Typed Array Specification] (http://www.khronos.org/registry/typedarray/specs/latest/) może pomóc: "Ta specyfikacja zapewnia interfejs API do współdziałania z natywnymi danymi binarnymi". – RobG

Odpowiedz

52

Wysłałem e-mail z deweloperem glMatrix i poniżej moja odpowiedź zawiera jego komentarze (pkt 2 & 3):

  1. tworząc nowy obiekt jest zazwyczaj szybciej niż z ArrayFloat32Array. Zysk jest istotny dla małych tablic, ale jest mniej (zależny od środowiska) z większymi tablicami.

  2. Dostęp danych z TypedArray (np. Float32Array) często jest szybciej niż z normalnej macierzy, co oznacza, że ​​większość operacji macierzy (oprócz tworzenia nowego obiektu) są szybsze TypedArrays.

  3. Jak również stwierdził @emidander, glMatrix został opracowany głównie dla WebGL, który wymaga, aby wektory i macierze były przekazywane jako Float32Array. Tak więc w przypadku aplikacji WebGL należy uwzględnić potencjalnie kosztowną konwersję z Array na Float32Array w każdym pomiarze wydajności.

Tak więc, nie jest zaskoczeniem, że najlepszym wyborem jest zależne od aplikacji:

  • Jeśli tablice są na ogół niewielkie i/lub liczba operacji na nich jest niski, tak że czas konstruktor jest znaczącym część czasu życia macierzy, użyj Array.

  • Jeśli czytelność kodu jest tak samo ważna jak wydajność, należy użyć Array (tj. Użyć [], zamiast konstruktora).

  • Jeśli tablice są bardzo duże i/lub są używane do wielu operacji, użyj funkcji TypedArray.

  • W przypadku aplikacji WebGL (lub innych aplikacji, które w innym przypadku wymagają konwersji typu), należy użyć Float32Array (lub innego urządzenia TypedArray).

+1

"duże" i "małe" to bardzo niejasne opisy, które zmieniają się w różnych kontekstach. Czy ktokolwiek może rozwinąć nieco, co jest uważane za "bardzo dużą" tablicę, gdy mówimy o Float32Array vs co jest bardzo małe? – yuvi

Powiązane problemy