36

Android APIの最新のアップデートでは、FloatMathは次のlint-warningでマークされています。

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

最近のハードウェアでは、doubleとfloatの速度が同じであることもここで言及されています。

現在作業中のアプリケーション(フローズンヨーグルト以上を対象)で三角関数を使用していますが、高精度は必要ないため、これFloatMathまでフローズンヨーグルトなどを使用しており、ダブルスに切り替える必要はありません。
ただし、「use Mathover FloatMath」-推奨事項では、floatが望ましい結果である場合にどちらを使用するかは示されていません。

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

float foo = FloatMath.sin(bar);

また

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

ちなみに、私はフローズンヨーグルトデバイスしか持っていないので、自分で適切なベンチマークを行うことはできません。

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

4

4 に答える 4

15

以下の結果からわかるように、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が必要です

于 2013-09-04T18:06:27.297 に答える
5

言うためのドキュメントFloatMath

数学に見られるものと同様の数学ルーチン。doubleとの間の変換のオーバーヘッドを発生させることなく、float値に対して直接計算を実行します。

そしてあなたの引用は言う:

フロートで操作する場合のパフォーマンス上の理由から、android.util.FloatMathの使用が推奨されました

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

したがって、以下を使用します。

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

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

于 2013-02-28T19:26:11.430 に答える
2

最近同じ問題を調べていたところ、この問題に関するこのバグレポートが見つかりました。以下の引用に示すように、関数は1桁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ツリーのドキュメントの変更に従うと、基本的にFroyo(2.2)以降のJITを搭載したAndroidのバージョンで関数が優先されることがわかりますMathFloatMath

于 2013-03-15T17:12:35.370 に答える
-1

doubleパフォーマンスがそれほど重要な場合は、何かを計算するたびにsとの間でキャストする時間を無駄にしたくないでしょう。

私が理解しているように、古いハードウェアでは、floatはdoubleよりも高速であったため、float用のMathライブラリが必要でした。現在、「最新のハードウェアでは、doubleはfloatと同じくらい高速です」。したがって、doubleではデフォルトMathを使用する必要があります。

アプリケーションにとって値がfloatであることが重要な場合(たとえば、メモリ消費のため)、FloatMathを頻繁にfloat foo = (float) Math.sin(bar);使用すると煩わしくなるため、引き続きFloatMathを使用する必要があります。

于 2013-02-28T19:40:56.580 に答える