diff options
-rw-r--r-- | core/java/android/util/FloatMath.java | 11 | ||||
-rw-r--r-- | core/jni/Android.mk | 1 | ||||
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 3 | ||||
-rw-r--r-- | core/jni/android_util_FloatMath.cpp | 61 | ||||
-rw-r--r-- | core/tests/benchmarks/src/android/util/FloatMathBenchmark.java | 103 |
5 files changed, 110 insertions, 69 deletions
diff --git a/core/java/android/util/FloatMath.java b/core/java/android/util/FloatMath.java index 0ffd5bd..d33ca0d 100644 --- a/core/java/android/util/FloatMath.java +++ b/core/java/android/util/FloatMath.java @@ -17,10 +17,13 @@ package android.util; /** - * Math routines similar to those found in {@link java.lang.Math}. On - * versions of Android with a JIT, these are significantly slower than - * the equivalent {@code Math} functions, which should be used in preference - * to these. + * Math routines similar to those found in {@link java.lang.Math}. + * + * <p>Historically these methods were faster than the equivalent double-based + * {@link java.lang.Math} methods. On versions of Android with a JIT they + * became slower and have since been re-implemented to wrap calls to + * {@link java.lang.Math}. {@link java.lang.Math} should be used in + * preference. */ public class FloatMath { diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 5d10f3c..9b3b091 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -80,7 +80,6 @@ LOCAL_SRC_FILES:= \ android_util_Binder.cpp \ android_util_EventLog.cpp \ android_util_Log.cpp \ - android_util_FloatMath.cpp \ android_util_Process.cpp \ android_util_StringBlock.cpp \ android_util_XmlBlock.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 0d2cdb9..796a0c3 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -90,8 +90,6 @@ extern int register_android_media_AudioTrack(JNIEnv *env); extern int register_android_media_JetPlayer(JNIEnv *env); extern int register_android_media_ToneGenerator(JNIEnv *env); -extern int register_android_util_FloatMath(JNIEnv* env); - namespace android { /* @@ -1229,7 +1227,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_SystemClock), REG_JNI(register_android_util_EventLog), REG_JNI(register_android_util_Log), - REG_JNI(register_android_util_FloatMath), REG_JNI(register_android_content_AssetManager), REG_JNI(register_android_content_StringBlock), REG_JNI(register_android_content_XmlBlock), diff --git a/core/jni/android_util_FloatMath.cpp b/core/jni/android_util_FloatMath.cpp deleted file mode 100644 index 73b7a6f..0000000 --- a/core/jni/android_util_FloatMath.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "jni.h" -#include <android_runtime/AndroidRuntime.h> -#include <math.h> -#include <float.h> -#include "SkTypes.h" - -class MathUtilsGlue { -public: - static float FloorF(JNIEnv* env, jobject clazz, float x) { - return floorf(x); - } - - static float CeilF(JNIEnv* env, jobject clazz, float x) { - return ceilf(x); - } - - static float SinF(JNIEnv* env, jobject clazz, float x) { - return sinf(x); - } - - static float CosF(JNIEnv* env, jobject clazz, float x) { - return cosf(x); - } - - static float SqrtF(JNIEnv* env, jobject clazz, float x) { - return sqrtf(x); - } - - static float ExpF(JNIEnv* env, jobject clazz, float x) { - return expf(x); - } - - static float PowF(JNIEnv* env, jobject clazz, float x, float y) { - return powf(x, y); - } - - static float HypotF(JNIEnv* env, jobject clazz, float x, float y) { - return hypotf(x, y); - } -}; - -static JNINativeMethod gMathUtilsMethods[] = { - {"floor", "(F)F", (void*) MathUtilsGlue::FloorF}, - {"ceil", "(F)F", (void*) MathUtilsGlue::CeilF}, - {"sin", "(F)F", (void*) MathUtilsGlue::SinF}, - {"cos", "(F)F", (void*) MathUtilsGlue::CosF}, - {"sqrt", "(F)F", (void*) MathUtilsGlue::SqrtF}, - {"exp", "(F)F", (void*) MathUtilsGlue::ExpF}, - {"pow", "(FF)F", (void*) MathUtilsGlue::PowF}, - {"hypot", "(FF)F", (void*) MathUtilsGlue::HypotF}, -}; - -int register_android_util_FloatMath(JNIEnv* env) -{ - int result = android::AndroidRuntime::registerNativeMethods(env, - "android/util/FloatMath", - gMathUtilsMethods, - SK_ARRAY_COUNT(gMathUtilsMethods)); - return result; -} - diff --git a/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java b/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java new file mode 100644 index 0000000..4f36492 --- /dev/null +++ b/core/tests/benchmarks/src/android/util/FloatMathBenchmark.java @@ -0,0 +1,103 @@ +package android.util; + +import com.google.caliper.Param; +import com.google.caliper.Runner; +import com.google.caliper.SimpleBenchmark; + +import android.util.FloatMath; + +import dalvik.system.VMDebug; + +public class FloatMathBenchmark extends SimpleBenchmark { + + public float timeFloatMathCeil(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.ceil(100.123f); + } + return f; + } + + public float timeFloatMathCeil_math(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += (float) Math.ceil(100.123f); + } + return f; + } + + public float timeFloatMathCos(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.cos(100.123f); + } + return f; + } + + public float timeFloatMathExp(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.exp(100.123f); + } + return f; + } + + public float timeFloatMathFloor(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.floor(100.123f); + } + return f; + } + + public float timeFloatMathHypot(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.hypot(100.123f, 100.123f); + } + return f; + } + + public float timeFloatMathPow(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.pow(10.123f, 10.123f); + } + return f; + } + + public float timeFloatMathSin(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.sin(100.123f); + } + return f; + } + + public float timeFloatMathSqrt(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += FloatMath.sqrt(100.123f); + } + return f; + } + + public float timeFloatMathSqrt_math(int reps) { + // Keep an answer so we don't optimize the method call away. + float f = 0.0f; + for (int i = 0; i < reps; i++) { + f += (float) Math.sqrt(100.123f); + } + return f; + } + +} |