BUG-987: improve generated type allocation 87/6987/3
authorRobert Varga <rovarga@cisco.com>
Wed, 14 May 2014 07:17:51 +0000 (09:17 +0200)
committerRobert Varga <rovarga@cisco.com>
Fri, 16 May 2014 12:14:07 +0000 (14:14 +0200)
This patch improves ArrayList allocation such it does not waste space in
generated types, since we know how big an array we need before hand. We
also use singletonList() and emptyList() as appropriate. Shaves off
about 2MB from retained size on a vanilla SP edition.

Change-Id: Ief18a029613f14c13abc985aa60388b704bae79e
Signed-off-by: Robert Varga <rovarga@cisco.com>
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedType.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractTypeMember.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java

index eefb847ff63046cb408857387390daea88c75614..a2bc6da9394ea0b0265313bcd9dcf38a8609f7a4 100644 (file)
@@ -39,13 +39,13 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
     private final List<GeneratedProperty> properties;
     private final boolean isAbstract;
 
-    public AbstractGeneratedType(AbstractGeneratedTypeBuilder<?> builder) {
+    public AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
         super(builder.getPackageName(), builder.getName());
         this.parent = builder.getParent();
         this.comment = builder.getComment();
         this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
-        this.implementsTypes = Collections.unmodifiableList(builder.getImplementsTypes());
-        this.constants = Collections.unmodifiableList(builder.getConstants());
+        this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
+        this.constants = makeUnmodifiable(builder.getConstants());
         this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations());
         this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
         this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(),
@@ -64,19 +64,29 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
         this.parent = parent;
         this.comment = comment;
         this.annotations = toUnmodifiableAnnotations(annotationBuilders);
-        this.implementsTypes = Collections.unmodifiableList(implementsTypes);
-        this.constants = Collections.unmodifiableList(constants);
+        this.implementsTypes = makeUnmodifiable(implementsTypes);
+        this.constants = makeUnmodifiable(constants);
         this.enumerations = toUnmodifiableEnumerations(enumBuilders);
         this.methodSignatures = toUnmodifiableMethods(methodBuilders);
         this.enclosedTypes = toUnmodifiableEnclosedTypes(enclosedGenTypeBuilders, enclosedGenTOBuilders);
         this.properties = toUnmodifiableProperties(propertyBuilders);
         this.isAbstract = isAbstract;
+    }
 
+    protected static final <T> List<T> makeUnmodifiable(final List<T> list) {
+        switch (list.size()) {
+        case 0:
+            return Collections.emptyList();
+        case 1:
+            return Collections.singletonList(list.get(0));
+        default:
+            return Collections.unmodifiableList(list);
+        }
     }
 
-    private List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
+    private static List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
             final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
-        final List<GeneratedType> enclosedTypesList = new ArrayList<>();
+        final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size() + enclosedGenTOBuilders.size());
         for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
             if (builder != null) {
                 enclosedTypesList.add(builder.toInstance());
@@ -88,39 +98,40 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
                 enclosedTypesList.add(builder.toInstance());
             }
         }
-        return enclosedTypesList;
+
+        return makeUnmodifiable(enclosedTypesList);
     }
 
-    protected final List<AnnotationType> toUnmodifiableAnnotations(final List<AnnotationTypeBuilder> annotationBuilders) {
-        final List<AnnotationType> annotationList = new ArrayList<>();
+    protected static final List<AnnotationType> toUnmodifiableAnnotations(final List<AnnotationTypeBuilder> annotationBuilders) {
+        final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
         for (final AnnotationTypeBuilder builder : annotationBuilders) {
             annotationList.add(builder.toInstance());
         }
-        return Collections.unmodifiableList(annotationList);
+        return makeUnmodifiable(annotationList);
     }
 
-    protected final List<MethodSignature> toUnmodifiableMethods(List<MethodSignatureBuilder> methodBuilders) {
-        final List<MethodSignature> methods = new ArrayList<>();
+    protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
+        final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
         for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
             methods.add(methodBuilder.toInstance(this));
         }
-        return Collections.unmodifiableList(methods);
+        return makeUnmodifiable(methods);
     }
 
-    protected final List<Enumeration> toUnmodifiableEnumerations(List<EnumBuilder> enumBuilders) {
-        final List<Enumeration> enums = new ArrayList<>();
+    protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
+        final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
         for (final EnumBuilder enumBuilder : enumBuilders) {
             enums.add(enumBuilder.toInstance(this));
         }
-        return Collections.unmodifiableList(enums);
+        return makeUnmodifiable(enums);
     }
 
-    protected final List<GeneratedProperty> toUnmodifiableProperties(List<GeneratedPropertyBuilder> methodBuilders) {
-        final List<GeneratedProperty> methods = new ArrayList<>();
+    protected final List<GeneratedProperty> toUnmodifiableProperties(final List<GeneratedPropertyBuilder> methodBuilders) {
+        final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
         for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) {
             methods.add(methodBuilder.toInstance(this));
         }
-        return Collections.unmodifiableList(methods);
+        return makeUnmodifiable(methods);
     }
 
     @Override
index 51721882883201c377ddb8e51c1a2e237aef3928..cfadce1a5e6f36938bbaacc8f06ea5af7759c0de 100644 (file)
@@ -29,11 +29,11 @@ abstract class AbstractTypeMember implements TypeMember {
 
     public AbstractTypeMember(final Type definingType, final String name,  final List<AnnotationType> annotations,
                               final String comment, final AccessModifier accessModifier, final Type returnType,
-                              boolean isFinal, boolean isStatic) {
+                              final boolean isFinal, final boolean isStatic) {
         super();
         this.definingType = definingType;
         this.name = name;
-        this.annotations = Collections.unmodifiableList(annotations);
+        this.annotations = annotations.isEmpty() ? Collections.<AnnotationType>emptyList() : Collections.unmodifiableList(annotations);
         this.comment = comment;
         this.accessModifier = accessModifier;
         this.returnType = returnType;
@@ -92,7 +92,7 @@ abstract class AbstractTypeMember implements TypeMember {
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
         if (this == obj) {
             return true;
         }
index a2ecc1018d1d765fba3a1c5a5ae67baf47bf7d2a..b3b1c7ce256ddff61166bc341dbafdfdc1b966ab 100644 (file)
@@ -23,16 +23,16 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         GeneratedTOBuilder {
 
     private GeneratedTransferObject extendsType;
-    private final List<GeneratedPropertyBuilder> equalsProperties = new ArrayList<>();
-    private final List<GeneratedPropertyBuilder> hashProperties = new ArrayList<>();
-    private final List<GeneratedPropertyBuilder> toStringProperties = new ArrayList<>();
+    private final ArrayList<GeneratedPropertyBuilder> equalsProperties = new ArrayList<>();
+    private final ArrayList<GeneratedPropertyBuilder> hashProperties = new ArrayList<>();
+    private final ArrayList<GeneratedPropertyBuilder> toStringProperties = new ArrayList<>();
     private boolean isTypedef = false;
     private boolean isUnionType = false;
     private boolean isUnionTypeBuilder = false;
     private Restrictions restrictions;
     private GeneratedPropertyBuilder SUID;
 
-    public GeneratedTOBuilderImpl(String packageName, String name) {
+    public GeneratedTOBuilderImpl(final String packageName, final String name) {
         super(packageName, name);
         setAbstract(false);
     }
@@ -61,26 +61,26 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
      * @return <code>new</code> instance of Method Signature Builder.
      */
     @Override
-    public MethodSignatureBuilder addMethod(String name) {
+    public MethodSignatureBuilder addMethod(final String name) {
         final MethodSignatureBuilder builder = super.addMethod(name);
         builder.setAbstract(false);
         return builder;
     }
 
     @Override
-    public GeneratedTOBuilder addEqualsIdentity(GeneratedPropertyBuilder property) {
+    public GeneratedTOBuilder addEqualsIdentity(final GeneratedPropertyBuilder property) {
         equalsProperties.add(property);
         return this;
     }
 
     @Override
-    public GeneratedTOBuilder addHashIdentity(GeneratedPropertyBuilder property) {
+    public GeneratedTOBuilder addHashIdentity(final GeneratedPropertyBuilder property) {
         hashProperties.add(property);
         return this;
     }
 
     @Override
-    public GeneratedTOBuilder addToStringProperty(GeneratedPropertyBuilder property) {
+    public GeneratedTOBuilder addToStringProperty(final GeneratedPropertyBuilder property) {
         toStringProperties.add(property);
         return this;
     }
@@ -91,17 +91,18 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
     }
 
     @Override
-    public void setRestrictions(Restrictions restrictions) {
+    public void setRestrictions(final Restrictions restrictions) {
         this.restrictions = restrictions;
     }
 
     @Override
-    public void setSUID(GeneratedPropertyBuilder suid) {
+    public void setSUID(final GeneratedPropertyBuilder suid) {
         this.SUID = suid;
     }
 
     @Override
     public GeneratedTransferObject toInstance() {
+        // FIXME: can we compact the arrays now? It needs to be thread-safe, though
         return new GeneratedTransferObjectImpl(this);
     }
 
@@ -133,17 +134,17 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
     }
 
     @Override
-    public void setTypedef(boolean isTypedef) {
+    public void setTypedef(final boolean isTypedef) {
         this.isTypedef = isTypedef;
     }
 
     @Override
-    public void setIsUnion(boolean isUnion) {
+    public void setIsUnion(final boolean isUnion) {
         this.isUnionType = isUnion;
     }
 
     @Override
-    public void setIsUnionBuilder(boolean isUnionTypeBuilder) {
+    public void setIsUnionBuilder(final boolean isUnionTypeBuilder) {
         this.isUnionTypeBuilder = isUnionTypeBuilder;
     }
 
@@ -160,7 +161,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         private final Restrictions restrictions;
         private final GeneratedProperty SUID;
 
-        public GeneratedTransferObjectImpl(GeneratedTOBuilderImpl builder) {
+        public GeneratedTransferObjectImpl(final GeneratedTOBuilderImpl builder) {
             super(builder);
             this.extendsType = builder.extendsType;
             this.equalsProperties = toUnmodifiableProperties(builder.equalsProperties);
@@ -260,7 +261,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
             return builder.toString();
         }
 
-        public String serializeTypedef(Type type) {
+        public String serializeTypedef(final Type type) {
             if (type instanceof ParameterizedType) {
                 ParameterizedType parameterizedType = (ParameterizedType) type;
                 StringBuffer sb = new StringBuffer();