diff options
author | C. Sean Young <csyoung@google.com> | 2015-05-18 14:12:30 -0500 |
---|---|---|
committer | C. Sean Young <csyoung@google.com> | 2015-05-20 10:34:56 -0500 |
commit | da4b2e21af0d8efcfe73ff060839c97a2d4b8b03 (patch) | |
tree | 14e68bbea9ae87875c8bb5c9ec51c168f953f7eb | |
parent | d1ccc1c9cfc5d1e7f400fa5bba4c773af56acb0c (diff) | |
download | android_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.tar.gz android_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.tar.bz2 android_external_doclava-da4b2e21af0d8efcfe73ff060839c97a2d4b8b03.zip |
Save memory by re-using empty TagInfo (and subclasses) arrays.
Arrays of TagInfo (and subclasses) often tend to be empty, as many
members simply won't have any of the relevant tags.
Re-using empty arrays saves potentially a dozen or more megabytes
for large projects.
Also some minor performance tweaks the Javadoc comment parsing.
Change-Id: Iffaddd3b59a4f8183f11efd6e2680aad95633ade
-rw-r--r-- | src/com/google/doclava/AttrTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/CodeTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/Comment.java | 49 | ||||
-rw-r--r-- | src/com/google/doclava/Converter.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/LiteralTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/MethodInfo.java | 11 | ||||
-rw-r--r-- | src/com/google/doclava/ParamTagInfo.java | 6 | ||||
-rwxr-xr-x | src/com/google/doclava/ParsedTagInfo.java | 8 | ||||
-rw-r--r-- | src/com/google/doclava/SampleTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/SeeTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/TagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/TextTagInfo.java | 6 | ||||
-rw-r--r-- | src/com/google/doclava/ThrowsTagInfo.java | 7 |
13 files changed, 101 insertions, 28 deletions
diff --git a/src/com/google/doclava/AttrTagInfo.java b/src/com/google/doclava/AttrTagInfo.java index 909cacf..04e5626 100644 --- a/src/com/google/doclava/AttrTagInfo.java +++ b/src/com/google/doclava/AttrTagInfo.java @@ -22,6 +22,12 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; public class AttrTagInfo extends TagInfo { + public static final AttrTagInfo[] EMPTY_ARRAY = new AttrTagInfo[0]; + + public static AttrTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new AttrTagInfo[size]; + } + private static final String REF_COMMAND = "ref"; private static final String NAME_COMMAND = "name"; private static final String DESCRIPTION_COMMAND = "description"; diff --git a/src/com/google/doclava/CodeTagInfo.java b/src/com/google/doclava/CodeTagInfo.java index 1a4a864..56ffd13 100644 --- a/src/com/google/doclava/CodeTagInfo.java +++ b/src/com/google/doclava/CodeTagInfo.java @@ -17,6 +17,12 @@ package com.google.doclava; public class CodeTagInfo extends TagInfo { + public static final CodeTagInfo[] EMPTY_ARRAY = new CodeTagInfo[0]; + + public static CodeTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new CodeTagInfo[size]; + } + private static String encode(String t) { t = t.replace("&", "&"); t = t.replace("<", "<"); diff --git a/src/com/google/doclava/Comment.java b/src/com/google/doclava/Comment.java index cfb7aaf..33dee3c 100644 --- a/src/com/google/doclava/Comment.java +++ b/src/com/google/doclava/Comment.java @@ -19,12 +19,15 @@ package com.google.doclava; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; public class Comment { static final Pattern FIRST_SENTENCE = Pattern.compile("((.*?)\\.)[ \t\r\n\\<](.*)", Pattern.DOTALL); - private static final String[] KNOWN_TAGS = new String[] { + private static final Set<String> KNOWN_TAGS = new HashSet<String>(Arrays.asList(new String[] { "@author", "@since", "@version", @@ -38,7 +41,7 @@ public class Comment { "@sample", "@include", "@serial", - }; + })); public Comment(String text, ContainerInfo base, SourcePositionInfo sp) { mText = text; @@ -296,7 +299,14 @@ public class Comment { } private boolean isWhitespaceChar(char c) { - return c == ' ' || c == '\r' || c == '\t' || c == '\n'; + switch (c) { + case ' ': + case '\r': + case '\t': + case '\n': + return true; + } + return false; } private void tag(String name, String text, boolean isInline, SourcePositionInfo pos) { @@ -346,13 +356,7 @@ public class Comment { } else if (name.equals("@include") || name.equals("@sample")) { mInlineTagsList.add(new SampleTagInfo(name, "@include", text, mBase, pos)); } else { - boolean known = false; - for (String s : KNOWN_TAGS) { - if (s.equals(name)) { - known = true; - break; - } - } + boolean known = KNOWN_TAGS.contains(name); if (!known) { known = Doclava.knownTags.contains(name); } @@ -416,7 +420,7 @@ public class Comment { results.add(t); } } - return results.toArray(new TagInfo[results.size()]); + return results.toArray(TagInfo.getArray(results.size())); } public ParamTagInfo[] paramTags() { @@ -516,18 +520,17 @@ public class Comment { mText = null; mInitialized = true; - mInlineTags = mInlineTagsList.toArray(new TagInfo[mInlineTagsList.size()]); - mParamTags = mParamTagsList.toArray(new ParamTagInfo[mParamTagsList.size()]); - mSeeTags = mSeeTagsList.toArray(new SeeTagInfo[mSeeTagsList.size()]); - mThrowsTags = mThrowsTagsList.toArray(new ThrowsTagInfo[mThrowsTagsList.size()]); - mReturnTags = - ParsedTagInfo.joinTags(mReturnTagsList.toArray(new ParsedTagInfo[mReturnTagsList.size()])); - mDeprecatedTags = - ParsedTagInfo.joinTags(mDeprecatedTagsList.toArray(new ParsedTagInfo[mDeprecatedTagsList - .size()])); - mUndeprecateTags = mUndeprecateTagsList.toArray(new TagInfo[mUndeprecateTagsList.size()]); - mAttrTags = mAttrTagsList.toArray(new AttrTagInfo[mAttrTagsList.size()]); - mBriefTags = mBriefTagsList.toArray(new TagInfo[mBriefTagsList.size()]); + mInlineTags = mInlineTagsList.toArray(TagInfo.getArray(mInlineTagsList.size())); + mParamTags = mParamTagsList.toArray(ParamTagInfo.getArray(mParamTagsList.size())); + mSeeTags = mSeeTagsList.toArray(SeeTagInfo.getArray(mSeeTagsList.size())); + mThrowsTags = mThrowsTagsList.toArray(ThrowsTagInfo.getArray(mThrowsTagsList.size())); + mReturnTags = ParsedTagInfo.joinTags( + mReturnTagsList.toArray(ParsedTagInfo.getArray(mReturnTagsList.size()))); + mDeprecatedTags = ParsedTagInfo.joinTags( + mDeprecatedTagsList.toArray(ParsedTagInfo.getArray(mDeprecatedTagsList.size()))); + mUndeprecateTags = mUndeprecateTagsList.toArray(TagInfo.getArray(mUndeprecateTagsList.size())); + mAttrTags = mAttrTagsList.toArray(AttrTagInfo.getArray(mAttrTagsList.size())); + mBriefTags = mBriefTagsList.toArray(TagInfo.getArray(mBriefTagsList.size())); mParamTagsList = null; mSeeTagsList = null; diff --git a/src/com/google/doclava/Converter.java b/src/com/google/doclava/Converter.java index e620bf3..3153b41 100644 --- a/src/com/google/doclava/Converter.java +++ b/src/com/google/doclava/Converter.java @@ -107,12 +107,14 @@ public class Converter { return (ClassInfo[]) mClasses.all(); } + private static final MethodDoc[] EMPTY_METHOD_DOC = new MethodDoc[0]; + private static void initClass(ClassDoc c, ClassInfo cl) { MethodDoc[] annotationElements; if (c instanceof AnnotationTypeDoc) { annotationElements = ((AnnotationTypeDoc) c).elements(); } else { - annotationElements = new MethodDoc[0]; + annotationElements = EMPTY_METHOD_DOC; } cl.init(Converter.obtainType(c), new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(c.interfaces()))), @@ -192,7 +194,7 @@ public class Converter { public static TagInfo[] convertTags(Tag[] tags, ContainerInfo base) { int len = tags.length; - TagInfo[] out = new TagInfo[len]; + TagInfo[] out = TagInfo.getArray(len); for (int i = 0; i < len; i++) { Tag t = tags[i]; /* diff --git a/src/com/google/doclava/LiteralTagInfo.java b/src/com/google/doclava/LiteralTagInfo.java index 1feb276..e6b9115 100644 --- a/src/com/google/doclava/LiteralTagInfo.java +++ b/src/com/google/doclava/LiteralTagInfo.java @@ -17,6 +17,12 @@ package com.google.doclava; public class LiteralTagInfo extends TagInfo { + public static final LiteralTagInfo[] EMPTY_ARRAY = new LiteralTagInfo[0]; + + public static LiteralTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new LiteralTagInfo[size]; + } + private static String encode(String t) { t = t.replace("&", "&"); t = t.replace("<", "<"); diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java index f1659f3..cf98d0f 100644 --- a/src/com/google/doclava/MethodInfo.java +++ b/src/com/google/doclava/MethodInfo.java @@ -405,7 +405,8 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv containingClass(), position())); } } - mThrowsTags = rv.toArray(new ThrowsTagInfo[rv.size()]); + + mThrowsTags = rv.toArray(ThrowsTagInfo.getArray(rv.size())); } return mThrowsTags; } @@ -424,6 +425,12 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv if (mParamTags == null) { final int N = mParameters.size(); + if (N == 0) { + // Early out for empty case. + mParamTags = ParamTagInfo.EMPTY_ARRAY; + return ParamTagInfo.EMPTY_ARRAY; + } + String[] names = new String[N]; String[] comments = new String[N]; SourcePositionInfo[] positions = new SourcePositionInfo[N]; @@ -464,7 +471,7 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv } // construct the results, and cache them for next time - mParamTags = new ParamTagInfo[N]; + mParamTags = ParamTagInfo.getArray(N); for (i = 0; i < N; i++) { mParamTags[i] = new ParamTagInfo("@param", "@param", names[i] + " " + comments[i], parent(), diff --git a/src/com/google/doclava/ParamTagInfo.java b/src/com/google/doclava/ParamTagInfo.java index f8329bc..13eb30b 100644 --- a/src/com/google/doclava/ParamTagInfo.java +++ b/src/com/google/doclava/ParamTagInfo.java @@ -22,6 +22,12 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; public class ParamTagInfo extends ParsedTagInfo { + public static final ParamTagInfo[] EMPTY_ARRAY = new ParamTagInfo[0]; + + public static ParamTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new ParamTagInfo[size]; + } + static final Pattern PATTERN = Pattern.compile("([^ \t\r\n]+)[ \t\r\n]+(.*)", Pattern.DOTALL); private boolean mIsTypeParameter; diff --git a/src/com/google/doclava/ParsedTagInfo.java b/src/com/google/doclava/ParsedTagInfo.java index bcb9230..aad3767 100755 --- a/src/com/google/doclava/ParsedTagInfo.java +++ b/src/com/google/doclava/ParsedTagInfo.java @@ -19,6 +19,12 @@ package com.google.doclava; import java.util.ArrayList; public class ParsedTagInfo extends TagInfo { + public static final ParsedTagInfo[] EMPTY_ARRAY = new ParsedTagInfo[0]; + + public static ParsedTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new ParsedTagInfo[size]; + } + private ContainerInfo mContainer; private String mCommentText; private Comment mComment; @@ -50,6 +56,6 @@ public class ParsedTagInfo extends TagInfo { list.add(t[j]); } } - return list.toArray(new TagInfo[list.size()]); + return list.toArray(TagInfo.getArray(list.size())); } } diff --git a/src/com/google/doclava/SampleTagInfo.java b/src/com/google/doclava/SampleTagInfo.java index a69a3f3..66eb9ac 100644 --- a/src/com/google/doclava/SampleTagInfo.java +++ b/src/com/google/doclava/SampleTagInfo.java @@ -44,6 +44,12 @@ import java.util.regex.Matcher; * samples/ApiDemos/src/com/google/app/Notification1.java Bleh} */ public class SampleTagInfo extends TagInfo { + public static final SampleTagInfo[] EMPTY_ARRAY = new SampleTagInfo[0]; + + public static SampleTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new SampleTagInfo[size]; + } + static final int STATE_BEGIN = 0; static final int STATE_MATCHING = 1; diff --git a/src/com/google/doclava/SeeTagInfo.java b/src/com/google/doclava/SeeTagInfo.java index 34e6aed..9f38655 100644 --- a/src/com/google/doclava/SeeTagInfo.java +++ b/src/com/google/doclava/SeeTagInfo.java @@ -19,6 +19,12 @@ package com.google.doclava; import com.google.clearsilver.jsilver.data.Data; public class SeeTagInfo extends TagInfo { + public static final SeeTagInfo[] EMPTY_ARRAY = new SeeTagInfo[0]; + + public static SeeTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new SeeTagInfo[size]; + } + private ContainerInfo mBase; LinkReference mLink; diff --git a/src/com/google/doclava/TagInfo.java b/src/com/google/doclava/TagInfo.java index ec1f811..7bb640e 100644 --- a/src/com/google/doclava/TagInfo.java +++ b/src/com/google/doclava/TagInfo.java @@ -19,6 +19,12 @@ package com.google.doclava; import com.google.clearsilver.jsilver.data.Data; public class TagInfo { + public static final TagInfo[] EMPTY_ARRAY = new TagInfo[0]; + + public static TagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new TagInfo[size]; + } + private String mName; private String mText; private String mKind; diff --git a/src/com/google/doclava/TextTagInfo.java b/src/com/google/doclava/TextTagInfo.java index 35a486b..7403883 100644 --- a/src/com/google/doclava/TextTagInfo.java +++ b/src/com/google/doclava/TextTagInfo.java @@ -17,6 +17,12 @@ package com.google.doclava; public class TextTagInfo extends TagInfo { + public static final TextTagInfo[] EMPTY_ARRAY = new TextTagInfo[0]; + + public static TextTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new TextTagInfo[size]; + } + TextTagInfo(String n, String k, String t, SourcePositionInfo p) { super(n, k, Doclava.escape(t), p); } diff --git a/src/com/google/doclava/ThrowsTagInfo.java b/src/com/google/doclava/ThrowsTagInfo.java index 5f49485..9a9e72f 100644 --- a/src/com/google/doclava/ThrowsTagInfo.java +++ b/src/com/google/doclava/ThrowsTagInfo.java @@ -22,7 +22,14 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; public class ThrowsTagInfo extends ParsedTagInfo { + public static final ThrowsTagInfo[] EMPTY_ARRAY = new ThrowsTagInfo[0]; + + public static ThrowsTagInfo[] getArray(int size) { + return size == 0 ? EMPTY_ARRAY : new ThrowsTagInfo[size]; + } + static final Pattern PATTERN = Pattern.compile("(\\S+)\\s+(.*)", Pattern.DOTALL); + private ClassInfo mException; public ThrowsTagInfo(String name, String kind, String text, ContainerInfo base, |