nell'ultimo aggiornamento delle API di Android il FloatMath
è contrassegnato con il seguente lint-avvertimento:Utilizzo di FloatMath o Math e un cast?
Nelle versioni precedenti di Android, utilizza android.util.FloatMath era consigliata per motivi di prestazioni quando si lavora su carri. Tuttavia, lo standard su hardware moderno è veloce quanto float (anche se prendono più memoria ), e nelle ultime versioni di Android, FloatMath è in realtà più lento dell'utilizzo di java.lang.Math a causa del modo in cui JIT ottimizza java .lang.Math. Pertanto, dovresti utilizzare Math invece di FloatMath se hai scelto come target solo Froyo e versioni successive.
Viene anche menzionato here che doppio e float hanno uguale velocità sull'hardware recente.
Sto usando alcuni calcoli trigonometrici in un'applicazione a cui sto lavorando (Froyo mirato e sopra), ma non è necessaria un'elevata precisione, quindi ho utilizzato float e FloatMath
finora, e non c'è assolutamente bisogno di passare a doppio.
Tuttavia, la raccomandazione "use Math
over FloatMath
" non indica quale utilizzare se float è il risultato desiderato.
Quindi, in breve; quale è preferibile?
float foo = FloatMath.sin(bar);
o
float foo = (float) Math.sin(bar);
Su un lato nota, ho solo un Froyo-dispositivo, quindi non posso davvero fare qualsiasi analisi comparativa adeguata per conto mio.
A partire dal livello di API 22 il FloatMath-classe è stata deprecata a favore della regolare Math-class.
Penso che il testo che hai citato significhi che se float è il risultato desiderato, dovresti usare la matematica invece di floatmath e cast. –
Prenderò qualsiasi richiesta relativa alla performance relativa di 'int' /' float'/'double' con un granello di sale molto grande. 'float' può essere leggermente più veloce semplicemente a causa dell'impronta di cache più piccola, e su iPhone 3GS,' float' è * significativamente * più veloce poiché può utilizzare l'unità NEON invece dell'unità VFP più lenta (l'unità NEON non supporta i doppi); questo potrebbe essere specifico per iDevice. Inoltre, un JIT auto-vettorico beneficerà automaticamente di 'float' più di' double' semplicemente perché può adattarsi a più di essi in ogni registro vettoriale. –
Potrebbe essere che i float vengano tutti memorizzati come doppi sugli ultimi dispositivi Android ?! – Philip