aboutsummaryrefslogtreecommitdiffstats
path: root/ide_common/src/com/android/ide/common/resources
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2012-06-11 12:10:55 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-06-11 12:10:55 -0700
commit99c6df921a1812169758f840719da372ad22da4b (patch)
tree8cd29000ebcc3d2b76a4986cb80c9ea64f460b7d /ide_common/src/com/android/ide/common/resources
parent3fd37a8d1bfe08985c0a9fddb2aeddb4c90b2df2 (diff)
parentb1c88df27114d615ebe24e7a9ba641ce89b98113 (diff)
downloadsdk-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.java45
-rwxr-xr-x[-rw-r--r--]ide_common/src/com/android/ide/common/resources/ResourceRepository.java91
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;
}
}
+