From b2454f9e669d2972ae1900fc2431b54697c68031 Mon Sep 17 00:00:00 2001 From: Genki Kondo Date: Wed, 16 Mar 2022 10:38:50 -0700 Subject: [PATCH] Add feature flag for spannable cache Summary: sSpannableCache is a significant user of Java heap memory - up to 0.22MB is retained by sSpannableCache. It turns out sSpannableCache was never hitting as hashCode is different for the same attributedString contents. attributedString.getInt("hash") provides the expected hash code. This indicates removing spannableCache will not affect perf. Will gate just in case though. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D34900414 fbshipit-source-id: 7563cde6ba9dc153072e7aebede99389ce3153e7 --- .../react/config/ReactFeatureFlags.java | 3 +++ .../react/views/text/TextLayoutManager.java | 27 ++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index 0010116c606..c2924d31025 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -109,4 +109,7 @@ public class ReactFeatureFlags { * JNI. */ public static boolean enableLargeTextMeasureCache = true; + + /** TODO: T113245006 Delete this flag. Enables caching of spannables for text */ + public static boolean enableSpannableCache = false; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java index ecf50f5df77..5c3ec6644d5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java @@ -31,6 +31,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableNativeMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactAccessibilityDelegate; import com.facebook.react.uimanager.ReactStylesDiffMap; @@ -197,19 +198,25 @@ public class TextLayoutManager { Spannable preparedSpannableText; - synchronized (sSpannableCacheLock) { - preparedSpannableText = sSpannableCache.get((ReadableNativeMap) attributedString); - if (preparedSpannableText != null) { - return preparedSpannableText; + if (ReactFeatureFlags.enableSpannableCache) { + synchronized (sSpannableCacheLock) { + preparedSpannableText = sSpannableCache.get((ReadableNativeMap) attributedString); + if (preparedSpannableText != null) { + return preparedSpannableText; + } } - } - preparedSpannableText = - createSpannableFromAttributedString( - context, attributedString, reactTextViewManagerCallback); + preparedSpannableText = + createSpannableFromAttributedString( + context, attributedString, reactTextViewManagerCallback); - synchronized (sSpannableCacheLock) { - sSpannableCache.put((ReadableNativeMap) attributedString, preparedSpannableText); + synchronized (sSpannableCacheLock) { + sSpannableCache.put((ReadableNativeMap) attributedString, preparedSpannableText); + } + } else { + preparedSpannableText = + createSpannableFromAttributedString( + context, attributedString, reactTextViewManagerCallback); } return preparedSpannableText;