web-dev-qa-db-ja.com

FloatMathまたはMathとキャストを使用していますか?

Android APIの最新の更新では、 FloatMath は次のリント警告でマークされています。

Androidの古いバージョンでは、フロートを操作するときのパフォーマンス上の理由から、Android.util.FloatMathの使用が推奨されていました。ただし、最新のハードウェアでは、doubleはfloatと同じくらい高速です(ただし、より多くのメモリを必要とします)。Androidの最近のバージョンでは、JITがJava.lang.Mathを最適化する方法により、FloatMathは実際にJava.lang.Mathを使用するよりも遅くなります。したがって、Froyo以上をターゲットにしている場合は、FloatMathの代わりにMathを使用する必要があります。

また、最近のハードウェアではdoubleとfloatの速度が等しいことも here に記載されています。

現在作業中のアプリケーション(Froyo以上を対象としています)で三角関数を使用していますが、高精度は必要ないため、これまでfloatとFloatMathを使用しており、doubleに切り替える必要はまったくありません。
ただし、「use Math over FloatMath」-推奨では、floatが望ましい結果である場合にどちらを使用するかは示されていません。

つまり、要するに。どちらが好ましいですか?

float foo = FloatMath.sin(bar);

または

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

補足説明として、私はFroyoデバイスしか持っていないため、自分で適切なベンチマークを実行することはできません。

APIレベル22の時点で、FloatMathクラスは非推奨になり、通常のMathクラスが採用されました。

36
Jave

以下の結果からわかるように、Java.lang.Mathを使用すると、doubleよりもfloatの方が速く、FloatMathよりも速くなります。さらに、FloatMathには、APIレベル17より前の.exp()または.pow()はありません。

Samsung GT_i9295(4.2.2)では、2 ^ 24サイクル

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

Log.d()を無視することをランダムに決定したため、サムスンのMath.sinのデータはありません。

HTC Hero_HT99VL(2.3.7)では、2 ^ 12サイクル

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()、および.hypot()にはAPIレベル17が必要です

15
A Timiney

FloatMathのドキュメント と言う:

Mathにあるものと同様のMathルーチン。 浮動小数点値の計算を直接実行しますdoubleとの間の変換のオーバーヘッドを発生させません。

そしてあなたの引用は言います:

android.util.FloatMathを使用することは、フロートを操作するときのパフォーマンス上の理由で推奨されました

おそらくFloatMathの利点は、常にfloatが必要な場合に特に当てはまりますが、現在ではこの利点は無効になっています。

だから使用する:

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

また、パフォーマンスが非常に重要であるため、これを心配する必要がある場合は、doubleへの切り替えが(変換のコストがかからないように)保証されることも考慮してください。

5
kabuko

私は最近同じ問題を調べていたところ、問題に関する バグレポート を見つけました。 Math関数は、以下の引用に示すように、FloatMath関数よりも桁違いに優れています。

DDMSを使用して、問題のコードのプロファイルを作成しました。以下の各関数は、100倍以上呼び出されました。

       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

AOSPツリーの ドキュメントの変更 に従うと、 here が表示されますAndroidのバージョンではMath関数がFloatMathよりも優先JIT。基本的にはFroyo(2.2)以降のものです。

2
ebarrenechea