From 8b5b25b4487e22eb8a7dae32ee32f420210321a0 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Sat, 13 Sep 2014 19:30:11 -0700 Subject: [PATCH] Reduce instructions required to obtain and recycle TypedArray Eliminates several field and method accesses by making the TypedArray pool local to a single Resources object. Removes an unnecessary synchronization. ReadXmlAttrs averaged 0.069 ms/op before, 0.064 ms/op after. BUG: 17484798 Change-Id: If790a5ba6596b47a04f117c8912974798a592052 --- core/java/android/content/res/Resources.java | 9 +++++-- core/java/android/content/res/TypedArray.java | 25 ++++++------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index cabe228817b25..7f276c24dc71d 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -16,6 +16,7 @@ package android.content.res; +import android.util.Pools.SynchronizedPool; import android.view.ViewDebug; import com.android.internal.util.XmlUtils; @@ -96,6 +97,9 @@ public class Resources { private static final LongSparseArray sPreloadedColorStateLists = new LongSparseArray(); + // Pool of TypedArrays targeted to this Resources object. + final SynchronizedPool mTypedArrayPool = new SynchronizedPool(5); + // Used by BridgeResources in layoutlib static Resources mSystem = null; @@ -121,9 +125,10 @@ public class Resources { private final int[] mCachedXmlBlockIds = { 0, 0, 0, 0 }; private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[4]; - private final AssetManager mAssets; + final AssetManager mAssets; + final DisplayMetrics mMetrics = new DisplayMetrics(); + private final Configuration mConfiguration = new Configuration(); - private final DisplayMetrics mMetrics = new DisplayMetrics(); private NativePluralRules mPluralRule; private CompatibilityInfo mCompatibilityInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 8607bbcc3168e..186623aa78d5e 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -20,7 +20,6 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; -import android.util.Pools.SynchronizedPool; import android.util.TypedValue; import com.android.internal.util.XmlUtils; @@ -37,15 +36,11 @@ import java.util.Arrays; * the positions of the attributes given to obtainStyledAttributes. */ public class TypedArray { - private static final SynchronizedPool mPool = new SynchronizedPool(5); static TypedArray obtain(Resources res, int len) { - final TypedArray attrs = mPool.acquire(); + final TypedArray attrs = res.mTypedArrayPool.acquire(); if (attrs != null) { attrs.mLength = len; - attrs.mResources = res; - attrs.mMetrics = res.getDisplayMetrics(); - attrs.mAssets = res.getAssets(); attrs.mRecycled = false; final int fullLen = len * AssetManager.STYLE_NUM_ENTRIES; @@ -63,9 +58,10 @@ public class TypedArray { new int[1+len], len); } - private Resources mResources; - private DisplayMetrics mMetrics; - private AssetManager mAssets; + private final Resources mResources; + private final DisplayMetrics mMetrics; + private final AssetManager mAssets; + private boolean mRecycled; /*package*/ XmlBlock.Parser mXml; @@ -872,17 +868,12 @@ public class TypedArray { } mRecycled = true; - mResources = null; - mMetrics = null; - mAssets = null; // These may have been set by the client. mXml = null; mTheme = null; - synchronized (mPool) { - mPool.release(this); - } + mResources.mTypedArrayPool.release(this); } /** @@ -984,8 +975,8 @@ public class TypedArray { /*package*/ TypedArray(Resources resources, int[] data, int[] indices, int len) { mResources = resources; - mMetrics = mResources.getDisplayMetrics(); - mAssets = mResources.getAssets(); + mMetrics = mResources.mMetrics; + mAssets = mResources.mAssets; mData = data; mIndices = indices; mLength = len;