summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2014-10-18 14:10:46 -0700
committerNeil Fuller <nfuller@google.com>2014-10-20 09:24:11 +0100
commit7b3db39aa47108c87dad5e930b6fec2292219abe (patch)
treefde0e407c8f711ca38d697a64aecb9b92918341f /core/jni
parented583f5ed97c40951341d5750ecb73be6b10579f (diff)
downloadframeworks_base-7b3db39aa47108c87dad5e930b6fec2292219abe.zip
frameworks_base-7b3db39aa47108c87dad5e930b6fec2292219abe.tar.gz
frameworks_base-7b3db39aa47108c87dad5e930b6fec2292219abe.tar.bz2
Replacing FloatMath native implementation with calls to Math
On modern versions of Android running in AOT mode FloatMath is slower than Math. Calls to Math.sqrt(), etc. are replaced by intrinsics which can be as small as a single CPU opcode. When running in interpreted mode the new implementation is unfortunately slower, but I'm judging this acceptable and likely to be improved over time. This change saves a small amount of native code. Example timings: Mako AOSP AOT: Method: Original / New / Direct call to Math ceil: 596ns / 146.ns / 111ns sqrt: 694ns / 56ns / 25ns Mako AOSP interpreted: Method: Original / New / Direct call to Math ceil: 1900ns / 2307ns / 1485ns sqrt: 1998ns / 2603ns / 1788ns Other calls Mako AOT: Method: Original / New cos: 635ns / 270ns exp: 566ns / 324ns floor: 604ns / 150ns hypot: 631ns / 232ns pow: 936ns / 643ns sin: 641ns / 299ns The advice to use Math directly, in preference to FloatMath, is still good. FloatMath will be deprecated separately. Bug: https://code.google.com/p/android/issues/detail?id=36199 Change-Id: If07fcbd78543d13bc6d75f9743f999860e8d58d7
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/Android.mk1
-rw-r--r--core/jni/AndroidRuntime.cpp3
-rw-r--r--core/jni/android_util_FloatMath.cpp61
3 files changed, 0 insertions, 65 deletions
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;
-}
-