Author: j...@google.com Date: Tue Jan 6 14:26:11 2009 New Revision: 4382 Modified: releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java releases/1.6/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
Log: Improve hosted mode performance by caching frequently referenced values. Patch by: jat Review by: scottb Modified: releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java ============================================================================== --- releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java (original) +++ releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/JClassType.java Tue Jan 6 14:26:11 2009 @@ -27,14 +27,22 @@ HasMetaData { /** + * Cached set of supertypes for this type (including itself). If null, + * the set has not been calculated yet. + */ + private Set<JClassType> flattenedSupertypes; + + /** * Returns all of the superclasses and superinterfaces for a given type * including the type itself. */ protected static Set<JClassType> getFlattenedSuperTypeHierarchy( JClassType type) { - Set<JClassType> typesSeen = new HashSet<JClassType>(); - getFlattenedSuperTypeHierarchyRecursive(type, typesSeen); - return typesSeen; + if (type.flattenedSupertypes == null) { + type.flattenedSupertypes = new HashSet<JClassType>(); + getFlattenedSuperTypeHierarchyRecursive(type, type.flattenedSupertypes); + } + return type.flattenedSupertypes; } /** @@ -309,13 +317,13 @@ // Superclass JClassType superclass = type.getSuperclass(); if (superclass != null) { - getFlattenedSuperTypeHierarchyRecursive(superclass, typesSeen); + typesSeen.addAll(getFlattenedSuperTypeHierarchy(superclass)); } // Check the interfaces JClassType[] intfs = type.getImplementedInterfaces(); for (JClassType intf : intfs) { - getFlattenedSuperTypeHierarchyRecursive(intf, typesSeen); + typesSeen.addAll(getFlattenedSuperTypeHierarchy(intf)); } } Modified: releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java ============================================================================== --- releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java (original) +++ releases/1.6/dev/core/src/com/google/gwt/core/ext/typeinfo/TypeOracle.java Tue Jan 6 14:26:11 2009 @@ -22,6 +22,7 @@ import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -167,7 +168,11 @@ } } - private final Set<JRealClassType> allTypes = new HashSet<JRealClassType>(); + /** + * A map of fully-qualify source names (ie, use "." rather than "$" for nested + * classes) to JRealClassTypes. + */ + private final Map<String, JRealClassType> allTypes = new HashMap<String, JRealClassType>(); private final Map<JType, JArrayType> arrayTypes = new IdentityHashMap<JType, JArrayType>(); @@ -210,33 +215,16 @@ } /** - * Finds a class or interface given its fully-qualified name. For nested + * Finds a class or interface given its fully-qualified name. + * + * @param name fully-qualified class/interface name - for nested * classes, use its source name rather than its binary name (that is, use a - * "." rather than a "$"). + * "." rather than a "$") * * @return <code>null</code> if the type is not found */ public JClassType findType(String name) { - // Try the dotted pieces, right to left. - // - int i = name.length() - 1; - while (i >= 0) { - int dot = name.lastIndexOf('.', i); - String pkgName = ""; - String typeName = name; - if (dot != -1) { - pkgName = name.substring(0, dot); - typeName = name.substring(dot + 1); - i = dot - 1; - } else { - i = -1; - } - JClassType result = findType(pkgName, typeName); - if (result != null) { - return result; - } - } - return null; + return allTypes.get(name); } /** @@ -482,7 +470,8 @@ * @return an array of types, possibly of zero length */ public JClassType[] getTypes() { - return allTypes.toArray(NO_JCLASSES); + Collection<JRealClassType> values = allTypes.values(); + return values.toArray(new JClassType[values.size()]); } public JWildcardType getWildcardType(JWildcardType.BoundType boundType, @@ -611,7 +600,8 @@ } void addNewType(JRealClassType newType) { - allTypes.add(newType); + String fqcn = newType.getQualifiedSourceName(); + allTypes.put(fqcn, newType); recentTypes.add(newType); } @@ -990,9 +980,9 @@ */ private void removeTypes(Set<JRealClassType> invalidTypes) { for (Iterator<JRealClassType> iter = invalidTypes.iterator(); iter.hasNext();) { - JClassType classType = iter.next(); - - allTypes.remove(classType); + JRealClassType classType = iter.next(); + String fqcn = classType.getQualifiedSourceName(); + allTypes.remove(fqcn); JPackage pkg = classType.getPackage(); if (pkg != null) { Modified: releases/1.6/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java ============================================================================== --- releases/1.6/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java (original) +++ releases/1.6/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java Tue Jan 6 14:26:11 2009 @@ -52,6 +52,7 @@ private Set<ZipFileResource> allZipFileResources; private Set<AbstractResource> cachedAnswers; + private String cachedLocation; private PathPrefixSet lastPrefixSet; private final ZipFile zipFile; @@ -80,7 +81,10 @@ @Override public String getLocation() { - return new File(zipFile.getName()).toURI().toString(); + if (cachedLocation == null) { + cachedLocation = new File(zipFile.getName()).toURI().toString(); + } + return cachedLocation; } public ZipFile getZipFile() { --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---