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
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user