Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46cfd93a authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Let's sprinkle some FastJNI into Resources.

Before:

               benchmark   us linear runtime
                GetColor 14.9 ===========
              GetInteger 19.9 ===============
    GetLayoutAndTraverse 38.4 =============================
               GetString 38.5 ==============================

After:

               benchmark   us linear runtime
                GetColor 13.9 ==========
              GetInteger 18.8 ==============
    GetLayoutAndTraverse 38.1 =============================
               GetString 38.2 ==============================

Change-Id: I8c20e14182d2645bc62a0e7fc6345e298b11933c
parent 0a7a9136
Loading
Loading
Loading
Loading
+22 −22
Original line number Diff line number Diff line
@@ -2156,9 +2156,9 @@ static const JNINativeMethod gAssetManagerMethods[] = {
        (void*) android_content_AssetManager_readAsset },
    { "seekAsset",      "(JJI)J",
        (void*) android_content_AssetManager_seekAsset },
    { "getAssetLength", "(J)J",
    { "getAssetLength", "!(J)J",
        (void*) android_content_AssetManager_getAssetLength },
    { "getAssetRemainingLength", "(J)J",
    { "getAssetRemainingLength", "!(J)J",
        (void*) android_content_AssetManager_getAssetRemainingLength },
    { "addAssetPathNative", "(Ljava/lang/String;Z)I",
        (void*) android_content_AssetManager_addAssetPath },
@@ -2174,25 +2174,25 @@ static const JNINativeMethod gAssetManagerMethods[] = {
        (void*) android_content_AssetManager_getLocales },
    { "getSizeConfigurations", "()[Landroid/content/res/Configuration;",
        (void*) android_content_AssetManager_getSizeConfigurations },
    { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V",
    { "setConfiguration", "!(IILjava/lang/String;IIIIIIIIIIIIII)V",
        (void*) android_content_AssetManager_setConfiguration },
    { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
    { "getResourceIdentifier","!(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
        (void*) android_content_AssetManager_getResourceIdentifier },
    { "getResourceName","(I)Ljava/lang/String;",
    { "getResourceName","!(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getResourceName },
    { "getResourcePackageName","(I)Ljava/lang/String;",
    { "getResourcePackageName","!(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getResourcePackageName },
    { "getResourceTypeName","(I)Ljava/lang/String;",
    { "getResourceTypeName","!(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getResourceTypeName },
    { "getResourceEntryName","(I)Ljava/lang/String;",
    { "getResourceEntryName","!(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getResourceEntryName },
    { "loadResourceValue","(ISLandroid/util/TypedValue;Z)I",
    { "loadResourceValue","!(ISLandroid/util/TypedValue;Z)I",
        (void*) android_content_AssetManager_loadResourceValue },
    { "loadResourceBagValue","(IILandroid/util/TypedValue;Z)I",
    { "loadResourceBagValue","!(IILandroid/util/TypedValue;Z)I",
        (void*) android_content_AssetManager_loadResourceBagValue },
    { "getStringBlockCount","()I",
    { "getStringBlockCount","!()I",
        (void*) android_content_AssetManager_getStringBlockCount },
    { "getNativeStringBlock","(I)J",
    { "getNativeStringBlock","!(I)J",
        (void*) android_content_AssetManager_getNativeStringBlock },
    { "getCookieName","(I)Ljava/lang/String;",
        (void*) android_content_AssetManager_getCookieName },
@@ -2210,21 +2210,21 @@ static const JNINativeMethod gAssetManagerMethods[] = {
        (void*) android_content_AssetManager_copyTheme },
    { "clearTheme", "(J)V",
        (void*) android_content_AssetManager_clearTheme },
    { "loadThemeAttributeValue", "(JILandroid/util/TypedValue;Z)I",
    { "loadThemeAttributeValue", "!(JILandroid/util/TypedValue;Z)I",
        (void*) android_content_AssetManager_loadThemeAttributeValue },
    { "getThemeChangingConfigurations", "(J)I",
    { "getThemeChangingConfigurations", "!(J)I",
        (void*) android_content_AssetManager_getThemeChangingConfigurations },
    { "dumpTheme", "(JILjava/lang/String;Ljava/lang/String;)V",
        (void*) android_content_AssetManager_dumpTheme },
    { "applyStyle","(JIIJ[I[I[I)Z",
    { "applyStyle","!(JIIJ[I[I[I)Z",
        (void*) android_content_AssetManager_applyStyle },
    { "resolveAttrs","(JII[I[I[I[I)Z",
    { "resolveAttrs","!(JII[I[I[I[I)Z",
        (void*) android_content_AssetManager_resolveAttrs },
    { "retrieveAttributes","(J[I[I[I)Z",
    { "retrieveAttributes","!(J[I[I[I)Z",
        (void*) android_content_AssetManager_retrieveAttributes },
    { "getArraySize","(I)I",
    { "getArraySize","!(I)I",
        (void*) android_content_AssetManager_getArraySize },
    { "retrieveArray","(I[I)I",
    { "retrieveArray","!(I[I)I",
        (void*) android_content_AssetManager_retrieveArray },

    // XML files.
@@ -2234,11 +2234,11 @@ static const JNINativeMethod gAssetManagerMethods[] = {
    // Arrays.
    { "getArrayStringResource","(I)[Ljava/lang/String;",
        (void*) android_content_AssetManager_getArrayStringResource },
    { "getArrayStringInfo","(I)[I",
    { "getArrayStringInfo","!(I)[I",
        (void*) android_content_AssetManager_getArrayStringInfo },
    { "getArrayIntResource","(I)[I",
    { "getArrayIntResource","!(I)[I",
        (void*) android_content_AssetManager_getArrayIntResource },
    { "getStyleAttributes","(I)[I",
    { "getStyleAttributes","!(I)[I",
        (void*) android_content_AssetManager_getStyleAttributes },

    // Bookkeeping.
+16 −16
Original line number Diff line number Diff line
@@ -372,37 +372,37 @@ static const JNINativeMethod gXmlBlockMethods[] = {
            (void*) android_content_XmlBlock_nativeGetStringBlock },
    { "nativeCreateParseState",     "(J)J",
            (void*) android_content_XmlBlock_nativeCreateParseState },
    { "nativeNext",                 "(J)I",
    { "nativeNext",                 "!(J)I",
            (void*) android_content_XmlBlock_nativeNext },
    { "nativeGetNamespace",         "(J)I",
    { "nativeGetNamespace",         "!(J)I",
            (void*) android_content_XmlBlock_nativeGetNamespace },
    { "nativeGetName",              "(J)I",
    { "nativeGetName",              "!(J)I",
            (void*) android_content_XmlBlock_nativeGetName },
    { "nativeGetText",              "(J)I",
    { "nativeGetText",              "!(J)I",
            (void*) android_content_XmlBlock_nativeGetText },
    { "nativeGetLineNumber",        "(J)I",
    { "nativeGetLineNumber",        "!(J)I",
            (void*) android_content_XmlBlock_nativeGetLineNumber },
    { "nativeGetAttributeCount",    "(J)I",
    { "nativeGetAttributeCount",    "!(J)I",
            (void*) android_content_XmlBlock_nativeGetAttributeCount },
    { "nativeGetAttributeNamespace","(JI)I",
    { "nativeGetAttributeNamespace","!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeNamespace },
    { "nativeGetAttributeName",     "(JI)I",
    { "nativeGetAttributeName",     "!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeName },
    { "nativeGetAttributeResource", "(JI)I",
    { "nativeGetAttributeResource", "!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeResource },
    { "nativeGetAttributeDataType", "(JI)I",
    { "nativeGetAttributeDataType", "!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeDataType },
    { "nativeGetAttributeData",    "(JI)I",
    { "nativeGetAttributeData",    "!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeData },
    { "nativeGetAttributeStringValue", "(JI)I",
    { "nativeGetAttributeStringValue", "!(JI)I",
            (void*) android_content_XmlBlock_nativeGetAttributeStringValue },
    { "nativeGetAttributeIndex",    "(JLjava/lang/String;Ljava/lang/String;)I",
    { "nativeGetAttributeIndex",    "!(JLjava/lang/String;Ljava/lang/String;)I",
            (void*) android_content_XmlBlock_nativeGetAttributeIndex },
    { "nativeGetIdAttribute",      "(J)I",
    { "nativeGetIdAttribute",      "!(J)I",
            (void*) android_content_XmlBlock_nativeGetIdAttribute },
    { "nativeGetClassAttribute",   "(J)I",
    { "nativeGetClassAttribute",   "!(J)I",
            (void*) android_content_XmlBlock_nativeGetClassAttribute },
    { "nativeGetStyleAttribute",   "(J)I",
    { "nativeGetStyleAttribute",   "!(J)I",
            (void*) android_content_XmlBlock_nativeGetStyleAttribute },
    { "nativeDestroyParseState",    "(J)V",
            (void*) android_content_XmlBlock_nativeDestroyParseState },
+84 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.content.res;

import android.util.AttributeSet;
import android.util.Xml;

import com.android.internal.R;
import com.google.caliper.SimpleBenchmark;

import org.xmlpull.v1.XmlPullParser;

public class ResourcesBenchmark extends SimpleBenchmark {

    private AssetManager mAsset;
    private Resources mRes;

    private int mTextId;
    private int mColorId;
    private int mIntegerId;
    private int mLayoutId;

    @Override
    protected void setUp() {
        mAsset = new AssetManager();
        mAsset.addAssetPath("/system/framework/framework-res.apk");
        mRes = new Resources(mAsset, null, null);

        mTextId = mRes.getIdentifier("cancel", "string", "android");
        mColorId = mRes.getIdentifier("transparent", "color", "android");
        mIntegerId = mRes.getIdentifier("config_shortAnimTime", "integer", "android");
        mLayoutId = mRes.getIdentifier("two_line_list_item", "layout", "android");
    }

    @Override
    protected void tearDown() {
        mAsset.close();
    }

    public void timeGetString(int reps) {
        for (int i = 0; i < reps; i++) {
            mRes.getText(mTextId);
        }
    }

    public void timeGetColor(int reps) {
        for (int i = 0; i < reps; i++) {
            mRes.getColor(mColorId, null);
        }
    }

    public void timeGetInteger(int reps) {
        for (int i = 0; i < reps; i++) {
            mRes.getInteger(mIntegerId);
        }
    }

    public void timeGetLayoutAndTraverse(int reps) throws Exception {
        for (int i = 0; i < reps; i++) {
            final XmlResourceParser parser = mRes.getLayout(mLayoutId);
            try {
                while (parser.next() != XmlPullParser.END_DOCUMENT) {
                    // Walk the entire tree
                }
            } finally {
                parser.close();
            }
        }
    }
}