diff options
author | Xavier Ducrohet <xav@android.com> | 2012-06-11 12:10:55 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-06-11 12:10:55 -0700 |
commit | 99c6df921a1812169758f840719da372ad22da4b (patch) | |
tree | 8cd29000ebcc3d2b76a4986cb80c9ea64f460b7d /ide_common/src/com/android/ide/common/resources | |
parent | 3fd37a8d1bfe08985c0a9fddb2aeddb4c90b2df2 (diff) | |
parent | b1c88df27114d615ebe24e7a9ba641ce89b98113 (diff) | |
download | sdk-99c6df921a1812169758f840719da372ad22da4b.zip sdk-99c6df921a1812169758f840719da372ad22da4b.tar.gz sdk-99c6df921a1812169758f840719da372ad22da4b.tar.bz2 |
Merge "Performance improvement"
Diffstat (limited to 'ide_common/src/com/android/ide/common/resources')
-rwxr-xr-x[-rw-r--r--] | ide_common/src/com/android/ide/common/resources/FrameworkResources.java | 45 | ||||
-rwxr-xr-x[-rw-r--r--] | ide_common/src/com/android/ide/common/resources/ResourceRepository.java | 91 |
2 files changed, 51 insertions, 85 deletions
diff --git a/ide_common/src/com/android/ide/common/resources/FrameworkResources.java b/ide_common/src/com/android/ide/common/resources/FrameworkResources.java index 381516c..4d8e681 100644..100755 --- a/ide_common/src/com/android/ide/common/resources/FrameworkResources.java +++ b/ide_common/src/com/android/ide/common/resources/FrameworkResources.java @@ -120,34 +120,6 @@ public class FrameworkResources extends ResourceRepository { ResourceType lastType = null; String lastTypeName = ""; - - // Precompute maps from name to ResourceItem such that when we find - // a public item's name we can quickly locate it. Without this, - // it's a linear search for each item, n times -- O(n^2). - // Precomputing a map is O(n) and looking up n times in the map is - // also O(n). - Map<ResourceType, Map<String, ResourceItem>> nameMap = - new HashMap<ResourceType, Map<String, ResourceItem>>(); - for (Entry<ResourceType, List<ResourceItem>> entry: mResourceMap.entrySet()) { - ResourceType type = entry.getKey(); - if (type == ResourceType.PUBLIC || type == ResourceType.DECLARE_STYLEABLE) { - // These are large maps (in android-15 for example the "public" - // ResourceType has 1734 items and declare-styleable has 210) that - // currently have no public exported names. Therefore, don't bother - // creating name lookup maps for these. (However, if by chance a future - // public.xml file does specify these, it will be found by the sequential - // search if map=null below.) - continue; - } - List<ResourceItem> items = entry.getValue(); - int size = items.size(); - Map<String, ResourceItem> map = new HashMap<String, ResourceItem>(size); - for (ResourceItem item : items) { - map.put(item.getName(), item); - } - nameMap.put(type, map); - } - while (true) { int event = parser.next(); if (event == XmlPullParser.START_TAG) { @@ -183,23 +155,9 @@ public class FrameworkResources extends ResourceRepository { } if (type != null) { ResourceItem match = null; - Map<String, ResourceItem> map = nameMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); if (map != null) { match = map.get(name); - } else { - // We skipped computing name maps for some large lists - // that currently don't have any public names, but - // on the off chance that they will show up, leave the - // old iteration based lookup here - List<ResourceItem> typeList = mResourceMap.get(type); - if (typeList != null) { - for (ResourceItem item : typeList) { - if (name.equals(item.getName())) { - match = item; - break; - } - } - } } if (match != null) { @@ -276,3 +234,4 @@ public class FrameworkResources extends ResourceRepository { } } } + diff --git a/ide_common/src/com/android/ide/common/resources/ResourceRepository.java b/ide_common/src/com/android/ide/common/resources/ResourceRepository.java index 3040dc0..48c9690 100644..100755 --- a/ide_common/src/com/android/ide/common/resources/ResourceRepository.java +++ b/ide_common/src/com/android/ide/common/resources/ResourceRepository.java @@ -36,8 +36,10 @@ import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.IdentityHashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -58,11 +60,12 @@ public abstract class ResourceRepository { protected final Map<ResourceFolderType, List<ResourceFolder>> mFolderMap = new EnumMap<ResourceFolderType, List<ResourceFolder>>(ResourceFolderType.class); - protected final Map<ResourceType, List<ResourceItem>> mResourceMap = - new EnumMap<ResourceType, List<ResourceItem>>(ResourceType.class); + protected final Map<ResourceType, Map<String, ResourceItem>> mResourceMap = + new EnumMap<ResourceType, Map<String, ResourceItem>>( + ResourceType.class); - private final Map<List<ResourceItem>, List<ResourceItem>> mReadOnlyListMap = - new IdentityHashMap<List<ResourceItem>, List<ResourceItem>>(); + private final Map<Map<String, ResourceItem>, Collection<ResourceItem>> mReadOnlyListMap = + new IdentityHashMap<Map<String, ResourceItem>, Collection<ResourceItem>>(); private final boolean mFrameworkRepository; @@ -193,13 +196,13 @@ public abstract class ResourceRepository { * @return true if the resource is known */ public boolean hasResourceItem(ResourceType type, String name) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list != null) { - for (ResourceItem item : list) { - if (name.equals(item.getName())) { - return true; - } + if (map != null) { + + ResourceItem resourceItem = map.get(name); + if (resourceItem != null) { + return true; } } @@ -225,16 +228,19 @@ public abstract class ResourceRepository { item = createResourceItem(name); - List<ResourceItem> list = mResourceMap.get(type); - if (list == null) { - list = new ArrayList<ResourceItem>(); - mResourceMap.put(type, list); + Map<String, ResourceItem> map = mResourceMap.get(type); + + if (map == null) { + map = new HashMap<String, ResourceItem>(); + mResourceMap.put(type, map); + } - list.add(item); + map.put(item.getName(), item); if (oldItem != null) { - list.remove(oldItem); + map.remove(oldItem.getName()); + } } @@ -324,16 +330,16 @@ public abstract class ResourceRepository { * @return a non null collection of resource items */ public Collection<ResourceItem> getResourceItemsOfType(ResourceType type) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list == null) { + if (map == null) { return Collections.emptyList(); } - List<ResourceItem> roList = mReadOnlyListMap.get(list); + Collection<ResourceItem> roList = mReadOnlyListMap.get(map); if (roList == null) { - roList = Collections.unmodifiableList(list); - mReadOnlyListMap.put(list, roList); + roList = Collections.unmodifiableCollection(map.values()); + mReadOnlyListMap.put(map, roList); } return roList; @@ -345,7 +351,7 @@ public abstract class ResourceRepository { * @return true if the repository contains resources of the given type, false otherwise. */ public boolean hasResourcesOfType(ResourceType type) { - List<ResourceItem> items = mResourceMap.get(type); + Map<String, ResourceItem> items = mResourceMap.get(type); return (items != null && items.size() > 0); } @@ -567,10 +573,10 @@ public abstract class ResourceRepository { } protected void removeFile(ResourceType type, ResourceFile file) { - List<ResourceItem> list = mResourceMap.get(type); - if (list != null) { - for (int i = 0 ; i < list.size(); i++) { - ResourceItem item = list.get(i); + Map<String, ResourceItem> map = mResourceMap.get(type); + if (map != null) { + Collection<ResourceItem> values = map.values(); + for (ResourceItem item : values) { item.removeFile(file); } } @@ -587,7 +593,7 @@ public abstract class ResourceRepository { FolderConfiguration referenceConfig) { // get the resource item for the given type - List<ResourceItem> items = mResourceMap.get(type); + Map<String, ResourceItem> items = mResourceMap.get(type); if (items == null) { return new HashMap<String, ResourceValue>(); } @@ -595,7 +601,7 @@ public abstract class ResourceRepository { // create the map HashMap<String, ResourceValue> map = new HashMap<String, ResourceValue>(items.size()); - for (ResourceItem item : items) { + for (ResourceItem item : items.values()) { ResourceValue value = item.getResourceValue(type, referenceConfig, isFrameworkRepository()); if (value != null) { @@ -614,13 +620,15 @@ public abstract class ResourceRepository { // Since removed files/folders remove source files from existing ResourceItem, loop through // all resource items and remove the ones that have no source files. - Collection<List<ResourceItem>> lists = mResourceMap.values(); - for (List<ResourceItem> list : lists) { - for (int i = 0 ; i < list.size() ;) { - if (list.get(i).hasNoSourceFile()) { - list.remove(i); - } else { - i++; + Collection<Map<String, ResourceItem>> maps = mResourceMap.values(); + for (Map<String, ResourceItem> map : maps) { + Set<String> keySet = map.keySet(); + Iterator<String> iterator = keySet.iterator(); + while (iterator.hasNext()) { + String name = iterator.next(); + ResourceItem resourceItem = map.get(name); + if (resourceItem.hasNoSourceFile()) { + iterator.remove(); } } } @@ -634,17 +642,16 @@ public abstract class ResourceRepository { * @return the existing ResourceItem or null if no match was found. */ private ResourceItem findDeclaredResourceItem(ResourceType type, String name) { - List<ResourceItem> list = mResourceMap.get(type); + Map<String, ResourceItem> map = mResourceMap.get(type); - if (list != null) { - for (ResourceItem item : list) { - // ignore inline - if (name.equals(item.getName()) && item.isDeclaredInline() == false) { - return item; - } + if (map != null) { + ResourceItem resourceItem = map.get(name); + if (resourceItem != null && !resourceItem.isDeclaredInline()) { + return resourceItem; } } return null; } } + |