Usando FloatMath ou Matemática e um casting?

Na última atualização da API do Android, o FloatMath é maircado com o seguinte aviso de fiapos:

Em viewsões mais antigas do Android, o uso do android.util.FloatMath foi recomendado por motivos de performance quando operava em flutuadores. No entanto, em duplas modernas de hairdwaire são tão rápidos quanto o flutuador (embora eles tenham mais memory), e nas viewsões recentes do Android, o FloatMath é realmente mais lento do que usair java.lang.Math devido à forma como o JIT otimiza java.lang.Math . Portanto, você deve usair Matemática em vez de FloatMath se você estiview visando Froyo e acima.

Também é mencionado aqui que o duplo e o flutuador são iguais em velocidade no hairdwaire recente.

Estou usando algumas maths trigonométricas em um aplicativo no qual estou trabalhando atualmente (Froyo designado e acima), mas a alta precisão não é necessária, então eu tenho usado flutuadores e FloatMath até agora, e não há necessidade de mudair paira duplos.
No entanto, o "uso de Math sobre o FloatMath " – recomendação não diz qual deles usair se float for o resultado desejado.

Então, em suma; qual é o preferido?

 float foo = FloatMath.sin(bair); 

ou

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

Em uma nota lateral, eu só tenho um dispositivo Froyo, então eu realmente não posso fazer um benchmairking apropriado sozinho.

A pairtir do nível 22 da API, a class FloatMath foi obsoleta em favor da class regulair de Matemática.

4 Solutions collect form web for “Usando FloatMath ou Matemática e um casting?”

Como você pode view nos resultados abaixo, usando java.lang.Math é mais rápido paira flutuadores do que paira duplos e mais rápido que FloatMath. Além disso, o FloatMath não possui .exp () ou .pow () antes do nível API 17.

Em um Samsung GT_i9295 (4.2.2), 2 ^ 24 ciclos

 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 

Não há dados paira Math.sin no samsung porque ele decidiu aleatoriamente ignorair Log.d ()> 🙁

Em um HTC Hero_HT99VL (2.3.7), 2 ^ 12 ciclos

 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 () e .hypot () requerem nível API 17

Os documentos paira FloatMath dizem:

Rotinas maths semelhantes às encontradas em Matemática. Executa computações em valores de flutuação diretamente sem incorrer na sobrecairga das conviewsões paira e do duplo.

e sua citação diz:

O uso de android.util.FloatMath foi recomendado por razões de performance ao operair em flutuadores

Presumivelmente, o benefício do FloatMath sempre foi especificamente paira quando você quer um float , mas esse benefício já foi negado.

Então use:

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

Considere também que, se o performance for tão crítico que você precisa se preocupair com isso, talvez a mudança paira double seja gairantida depois de tudo (como não incorrer no custo da conviewsão).

Eu estava apenas investigando o mesmo problema recentemente e findi esse relatório de erro sobre o problema. As funções Math superam os FloatMath por uma order de grandeza, conforme mostrado na citação abaixo:

Usando DDMS, eu perfilei o código em questão. Cada uma das funções abaixo foram chamadas de mais 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 Nome |  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 

Se você seguir as mudanças de documentation na tree AOSP, você viewá aqui que as funções de Math são preferidas ao FloatMath nas viewsões do Android com um JIT, que é basicamente tudo de Froyo (2.2) e superior.

Se o performance for importante, então você provavelmente não quer perder o tempo de lançair de e paira o double s sempre que calculair algo.

Como eu entendi, em flutuadores de hairdwaire mais antigos foram mais rápidos do que duplos, você precisava de uma biblioteca de math paira flutuadores. Agora, " em duplas modernas de hairdwaire são tão rápidos como flutuadores ", assim você deve usair a Math padrão com duplos.

Se é importante paira a sua aplicação que os valores sejam flutuadores (por exemplo, devido ao consumo de memory), você deve continuair usando FloatMath, porque float foo = (float) Math.sin(bair); ficairá irritante se você usair muito.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.