Optimize DexLimitTracker with thread-local interning. PiperOrigin-RevId: 930668051 Change-Id: I98ccfd23511f261e68c2ab8e3de7d257532dc46c
diff --git a/src/tools/java/com/google/devtools/build/android/dexer/DexLimitTracker.java b/src/tools/java/com/google/devtools/build/android/dexer/DexLimitTracker.java index 95cbb44..14d74c5 100644 --- a/src/tools/java/com/google/devtools/build/android/dexer/DexLimitTracker.java +++ b/src/tools/java/com/google/devtools/build/android/dexer/DexLimitTracker.java
@@ -29,7 +29,8 @@ */ class DexLimitTracker { - private static final Interner<String> interner = Interners.newWeakInterner(); + private static final ThreadLocal<Interner<String>> threadLocalInterner = + ThreadLocal.withInitial(Interners::newWeakInterner); private final HashSet<String> fieldsSeen = new HashSet<>(); private final HashSet<String> methodsSeen = new HashSet<>(); @@ -100,7 +101,7 @@ } private static String typeName(Dex dex, int typeIndex) { - return interner.intern(dex.typeNames().get(typeIndex)); + return threadLocalInterner.get().intern(dex.typeNames().get(typeIndex)); } private static String fieldSignature(Dex dex, int fieldIndex) { @@ -108,7 +109,7 @@ String name = dex.strings().get(field.getNameIndex()); String declaringClass = typeName(dex, field.getDeclaringClassIndex()); String type = typeName(dex, field.getTypeIndex()); - return interner.intern(declaringClass + "." + name + ":" + type); + return threadLocalInterner.get().intern(declaringClass + "." + name + ":" + type); } private static String methodSignature(Dex dex, int methodIndex) { @@ -122,7 +123,8 @@ for (short parameterTypeIndex : parameterTypeIndices.getTypes()) { parameterTypes.append(typeName(dex, parameterTypeIndex & 0xFFFF)); } - return interner.intern( - declaringClass + "." + name + ":" + returnType + "(" + parameterTypes + ")"); + return threadLocalInterner + .get() + .intern(declaringClass + "." + name + ":" + returnType + "(" + parameterTypes + ")"); } }