2013-04-04 4 views
30

Quand est-il sensé d'utiliser un Float32Array au lieu d'un JavaScript standard Array pour les applications de navigateur?Quand utiliser Float32Array au lieu de Array en JavaScript

Cette performance test montre Float32Array d'être, en général, plus lent - et si je comprends bien, un Array stocke des numéros comme 64bit - donc il n'y a aucun avantage dans la précision.

En dehors de toute réponse possible de la performance, Float32Array présente également l'inconvénient de la lisibilité - avoir à utiliser un constructeur:

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

place un littéral de tableau

a = [3.5, 4.5]; 

Je demande cela parce que je J'utilise la bibliothèque glMatrix par défaut Float32Array - et je me demande s'il y a une raison pour laquelle je ne devrais pas le forcer à utiliser Array à la place, ce qui me permettra d'utiliser des littéraux de tableau.

+0

Je ne trouve aucun site qui répond à cette question, je suppose que le principal avantage est qu'il utilise moins de mémoire. Donc, si vous travaillez avec d'énormes tableaux à virgule flottante, cela pourrait être un avantage. – Barmar

+0

Il s'agissait peut-être d'un port de langage pour JavaScript et Float32Array était le plus proche de ce que la langue source avait à disposition. –

+2

La spécification [Typed Array Specification] (http://www.khronos.org/registry/typedarray/specs/latest/) peut vous aider: «Cette spécification fournit une API pour l'interopérabilité avec les données binaires natives». – RobG

Répondre

52

J'ai envoyé le développeur de glMatrix et ma réponse ci-dessous comprend ses commentaires (points 2 & 3):

  1. La création d'un nouvel objet est généralement plus rapide avec Array que Float32Array. Le gain est significatif pour les petits réseaux, mais il est inférieur (dépend de l'environnement) avec des réseaux plus grands.

  2. Accès données à partir d'un TypedArray (par ex. Float32Array) est souvent plus rapide que d'une matrice normale, ce qui signifie que la plupart des opérations de réseau (outre la création d'un nouvel objet) sont plus rapides avec TypedArrays.

  3. Comme également indiqué par @emidander, glMatrix a été développé principalement pour WebGL, qui exige que les vecteurs et les matrices soient passés comme Float32Array. Ainsi, pour une application WebGL, la conversion potentiellement coûteuse de Array à Float32Array devrait être incluse dans toute mesure de performance.

donc, sans surprise, le meilleur choix dépend de l'application:

  • Si les tableaux sont généralement de petite taille, et/ou le nombre d'opérations sur eux est faible, de sorte que le temps de constructeur est une importante proportion de la durée de vie de la matrice, utilisez Array.

  • Si la lisibilité du code est aussi importante que les performances, alors utilisez Array (à savoir, utilisez [], au lieu d'un constructeur).

  • Si les tableaux sont très volumineux et/ou sont utilisés pour de nombreuses opérations, utilisez un TypedArray.

  • Pour les applications WebGL (ou d'autres applications qui nécessiteraient sinon une conversion de type), utilisez Float32Array (ou autre typeTabledArray).

+1

"grand" et "petit" sont des descriptions très vagues qui changent dans différents contextes. Quelqu'un peut-il développer un peu ce qui est considéré comme un "très grand" tableau lorsque nous parlons de Float32Array vs ce qui est très petit? – yuvi

Questions connexes