web-dev-qa-db-fra.com

Vous utilisez FloatMath ou Math et un casting?

Dans la dernière mise à jour de l'API Android Android, le FloatMath est marqué de l'avertissement de peluches suivant:

Dans les anciennes versions d'Android, l'utilisation d'Android.util.FloatMath était recommandée pour des raisons de performances lors de l'utilisation sur des flottants. Cependant, sur le matériel moderne, les doubles sont aussi rapides que float (bien qu'ils prennent plus de mémoire), et dans les versions récentes d'Android, FloatMath est en fait plus lent que l'utilisation de Java.lang.Math en raison de la façon dont le JIT optimise Java.lang.Math . Par conséquent, vous devez utiliser Math au lieu de FloatMath si vous ne ciblez que Froyo et au-dessus.

Il est également mentionné ici que double et float sont égaux en vitesse sur le matériel récent.

J'utilise des mathématiques trigonométriques dans une application sur laquelle je travaille actuellement (Froyo ciblé et supérieur), mais la haute précision n'est pas nécessaire, j'ai donc utilisé des flottants et FloatMath jusqu'à présent, et il n'y a aucun besoin pour passer en double.
Cependant, la recommandation "use Math over FloatMath" - ne dit pas laquelle utiliser si float est le résultat souhaité.

Donc, en bref; lequel est préférable?

float foo = FloatMath.sin(bar);

ou

float foo = (float) Math.sin(bar);

En passant, je n'ai qu'un appareil Froyo, donc je ne peux pas vraiment faire de benchmarking par moi-même.

Depuis le niveau 22 de l'API, la classe FloatMath a été déconseillée au profit de la classe Math régulière.

36
Jave

Comme vous pouvez le voir dans les résultats ci-dessous, l'utilisation de Java.lang.Math est plus rapide pour les flottants que pour les doubles, et plus rapide que FloatMath. De plus, FloatMath n'a pas .exp () ou .pow () avant le niveau 17 de l'API.

Sur un Samsung GT_i9295 (4.2.2), 2 ^ 24 cycles

Math.exp(D)      Total:     7405 ms,     Per Op: 0.0004414 ms
(F)Math.exp(F)   Total:     5153 ms,     Per Op: 0.0003071 ms
FloatMath.exp(F) Total:     8533 ms,     Per Op: 0.0005086 ms

Aucune donnée pour Math.sin sur le Samsung car il a décidé au hasard d'ignorer Log.d ()> :(

Sur un HTC Hero_HT99VL (2.3.7), 2 ^ 12 cycles

Math.sin(D)      Total:       42 ms,     Per Op: 0.0102539 ms
(F)Math.sin(F)   Total:       33 ms,     Per Op: 0.0080566 ms
FloatMath.sin(F) Total:       38 ms,     Per Op: 0.0092773 ms

Math.exp(D)      Total:       56 ms,     Per Op: 0.0136719 ms
(F)Math.exp(F)   Total:       47 ms,     Per Op: 0.0114746 ms

FloatMath.exp (), .pos () et .hypot () nécessitent l'API niveau 17

15
A Timiney

Les documents pour FloatMath disent:

Routines mathématiques similaires à celles trouvées en mathématiques. Effectue des calculs sur les valeurs flottantes directement sans encourir la surcharge de conversions vers et depuis le double.

et votre citation dit:

l'utilisation d'Android.util.FloatMath a été recommandée pour des raisons de performances lors de l'utilisation de flotteurs

Vraisemblablement, l'avantage de FloatMath était toujours spécifiquement pour quand vous voulez un float, mais cet avantage a maintenant été annulé.

Alors utilisez:

float foo = (float) Math.sin(bar);

Considérez également que si les performances sont si critiques que vous devez vous en préoccuper, le passage à double est peut-être justifié après tout (car cela n'entraînera pas de coût de conversion).

5
kabuko

Je regardais récemment le même problème et j'ai trouvé ceci rapport de bogue sur le problème. Les fonctions Math surpassent celles FloatMath d'un ordre de grandeur, comme indiqué dans la citation ci-dessous:

En utilisant DDMS, j'ai profilé le code en question. Chacune des fonctions ci-dessous a été appelée plus de 100x.

       Name                 | Cpu Time / Call
----------------------------------------------
Java/lang/Math.sin (D)D     | 0.005
Java/lang/Math.cos (D)D     | 0.007
Java/lang/Math.sqrt (D)D    | 0.004
Android/util/FloatMath.sin  | 0.017
Android/util/FloatMath.cos  | 0.017
Android/util/FloatMath.sqrt | 0.016

Si vous suivez modifications de la documentation dans l'arborescence AOSP, vous verrez ici que les fonctions Math sont préférées à FloatMath sur les versions de = Android avec un JIT, qui est essentiellement n'importe quoi de Froyo (2.2) et plus.

2
ebarrenechea