From 676a597064e316cefc6423c29ac23c85e5d22c7e Mon Sep 17 00:00:00 2001 From: Piotr Jastrzebski Date: Mon, 2 Mar 2015 07:54:06 +0000 Subject: Avoid unnecessary creation of StringIdItem objects Profiler showed for Music app that StringIdsSection.intern(CstString) was called 430594 times and only 52903 times strings.get(value) in StringIdsSection.intern(StringIdItem) returned null. This means that 377691 instances of StringIdItem were created unnecessarily. StringIdsSection.intern(CstString) created them to be able to use StringIdsSection.intern(StringIdItem) but inside this method CstString is obtained from StringIdItem and StringIdItem is useless unless strings.get(value) returns null. Change-Id: I08978b0a28fe7bd13805e44f9d52a4bbf137fd0b --- .../com/android/jack/dx/dex/file/StringIdsSection.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'dx') diff --git a/dx/src/com/android/jack/dx/dex/file/StringIdsSection.java b/dx/src/com/android/jack/dx/dex/file/StringIdsSection.java index b9d6c0d..53e5241 100644 --- a/dx/src/com/android/jack/dx/dex/file/StringIdsSection.java +++ b/dx/src/com/android/jack/dx/dex/file/StringIdsSection.java @@ -108,7 +108,21 @@ public final class StringIdsSection extends UniformItemSection { * @return {@code non-null;} the interned string */ public StringIdItem intern(CstString string) { - return intern(new StringIdItem(string)); + if (string == null) { + throw new NullPointerException("string == null"); + } + + throwIfPrepared(); + + StringIdItem already = strings.get(string); + + if (already != null) { + return already; + } + + StringIdItem result = new StringIdItem(string); + strings.put(string, result); + return result; } /** -- cgit v1.1