From e1b6916423c885b7dde0f4398f824f8a2ac5d201 Mon Sep 17 00:00:00 2001 From: orbiter Date: Wed, 9 Mar 2011 09:29:05 +0000 Subject: [PATCH] always try to guess the size of a StringBuilder to prevent too many memory re-allocations git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7572 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- htroot/api/util/getpageinfo_p.java | 7 ++-- htroot/yacysearchitem.java | 4 +-- source/de/anomic/data/ListManager.java | 4 +-- source/de/anomic/data/URLLicense.java | 2 +- source/de/anomic/search/QueryParams.java | 2 +- source/de/anomic/search/RankingProfile.java | 13 +++----- source/de/anomic/search/TextSnippet.java | 6 ++-- source/de/anomic/server/serverObjects.java | 2 +- source/de/anomic/yacy/yacyPeerActions.java | 4 +-- source/de/anomic/yacy/yacySearch.java | 2 +- source/net/yacy/YaCySearchClient.java | 6 ++-- source/net/yacy/cora/document/JSONArray.java | 2 +- .../yacy/cora/document/MultiProtocolURI.java | 22 ++++++------- source/net/yacy/cora/document/Punycode.java | 32 +++++++++---------- source/net/yacy/cora/document/RSSReader.java | 2 +- source/net/yacy/document/Document.java | 10 +++--- .../net/yacy/document/SnippetExtractor.java | 1 + .../document/content/SurrogateReader.java | 2 +- .../net/yacy/document/parser/docParser.java | 6 ++-- source/net/yacy/document/parser/psParser.java | 2 +- .../yacy/document/parser/sitemapParser.java | 2 +- .../yacy/document/parser/torrentParser.java | 2 +- source/net/yacy/kelondro/blob/Tables.java | 2 +- source/net/yacy/kelondro/index/Column.java | 2 +- source/net/yacy/kelondro/index/Row.java | 2 +- .../yacy/kelondro/index/RowCollection.java | 2 +- .../kelondro/logging/MiniLogFormatter.java | 2 +- source/net/yacy/kelondro/util/BDecoder.java | 10 +++--- source/net/yacy/kelondro/util/FileUtils.java | 4 +-- source/net/yacy/kelondro/util/MapTools.java | 6 ++-- .../kelondro/workflow/WorkflowProcessor.java | 2 +- 31 files changed, 83 insertions(+), 84 deletions(-) diff --git a/htroot/api/util/getpageinfo_p.java b/htroot/api/util/getpageinfo_p.java index 8482a2e70..137066838 100755 --- a/htroot/api/util/getpageinfo_p.java +++ b/htroot/api/util/getpageinfo_p.java @@ -85,10 +85,11 @@ public class getpageinfo_p { prop.putXML("lang", (languages == null) ? "unknown" : languages.iterator().next()); // get links and put them into a semicolon-separated list - StringBuilder links = new StringBuilder(); - StringBuilder filter = new StringBuilder(); + Set uris = scraper.getAnchors().keySet(); + StringBuilder links = new StringBuilder(uris.size() * 80); + StringBuilder filter = new StringBuilder(uris.size() * 40); count = 0; - for (MultiProtocolURI uri: scraper.getAnchors().keySet()) { + for (MultiProtocolURI uri: uris) { links.append(';').append(uri.toNormalform(true, false)); filter.append('|').append(uri.getProtocol()).append("://").append(uri.getHost()).append(".*"); prop.putXML("links_" + count + "_link", uri.toNormalform(true, false)); diff --git a/htroot/yacysearchitem.java b/htroot/yacysearchitem.java index 08c6f2563..d4226d6fe 100644 --- a/htroot/yacysearchitem.java +++ b/htroot/yacysearchitem.java @@ -160,9 +160,9 @@ public class yacysearchitem { prop.putHTML("content_creator", result.creator());// author prop.putHTML("content_subject", result.subject()); final Set[] query = theQuery.queryWords(); - final StringBuilder s = new StringBuilder(); + final StringBuilder s = new StringBuilder(query[0].size() * 20); for (final String t: query[0]) { - s.append("+").append(t); + s.append('+').append(t); } final String words = (s.length() > 0) ? s.substring(1) : ""; prop.putHTML("content_words", words); diff --git a/source/de/anomic/data/ListManager.java b/source/de/anomic/data/ListManager.java index 3b510bd8f..56d254692 100644 --- a/source/de/anomic/data/ListManager.java +++ b/source/de/anomic/data/ListManager.java @@ -123,13 +123,13 @@ public class ListManager { * @return String with elements from set separated by comma. */ public static String collection2string(final Collection col){ - final StringBuilder str = new StringBuilder(); + final StringBuilder str = new StringBuilder(col.size() * 40); if (col != null && !col.isEmpty()) { final Iterator it = col.iterator(); str.append(it.next()); while(it.hasNext()) { - str.append(",").append(it.next()); + str.append(',').append(it.next()); } } diff --git a/source/de/anomic/data/URLLicense.java b/source/de/anomic/data/URLLicense.java index 39544b83f..0e329bbd1 100644 --- a/source/de/anomic/data/URLLicense.java +++ b/source/de/anomic/data/URLLicense.java @@ -56,7 +56,7 @@ public class URLLicense { public String aquireLicense(final DigestURI url) { // generate license key - StringBuilder stringBuilder = new StringBuilder(); + StringBuilder stringBuilder = new StringBuilder(keylen * 2); if (url == null) return stringBuilder.toString(); while (stringBuilder.length() < keylen) stringBuilder.append(Integer.toHexString(random.nextInt())); String license = stringBuilder.substring(0, keylen); diff --git a/source/de/anomic/search/QueryParams.java b/source/de/anomic/search/QueryParams.java index 3c6bdca6d..0aa337535 100644 --- a/source/de/anomic/search/QueryParams.java +++ b/source/de/anomic/search/QueryParams.java @@ -472,7 +472,7 @@ public final class QueryParams { final String ext, final int page, final QueryParams theQuery, String newQueryString, final String originalUrlMask, final String nav) { - final StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(120); sb.append("/yacysearch."); sb.append(ext); sb.append("?query="); diff --git a/source/de/anomic/search/RankingProfile.java b/source/de/anomic/search/RankingProfile.java index 6f6a7da77..e1c52184d 100644 --- a/source/de/anomic/search/RankingProfile.java +++ b/source/de/anomic/search/RankingProfile.java @@ -27,7 +27,6 @@ package de.anomic.search; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import net.yacy.kelondro.logging.Log; @@ -241,15 +240,13 @@ public class RankingProfile { } public String toExternalURLGet(final String prefix) { - final Iterator> i = toExternalMap("").entrySet().iterator(); - Map.Entry entry; - final StringBuilder ext = new StringBuilder(); - while (i.hasNext()) { - entry = i.next(); - ext.append("&"); + final Map emap = toExternalMap(""); + final StringBuilder ext = new StringBuilder(emap.size() * 40); + for (Map.Entry entry: emap.entrySet()) { + ext.append('&'); ext.append(prefix); ext.append(entry.getKey()); - ext.append("="); + ext.append('='); ext.append(entry.getValue()); } return ext.toString(); diff --git a/source/de/anomic/search/TextSnippet.java b/source/de/anomic/search/TextSnippet.java index 0b79f0a0f..2feeaaa4b 100644 --- a/source/de/anomic/search/TextSnippet.java +++ b/source/de/anomic/search/TextSnippet.java @@ -350,8 +350,8 @@ public class TextSnippet implements Comparable, Comparator, Comparator"; diff --git a/source/de/anomic/server/serverObjects.java b/source/de/anomic/server/serverObjects.java index e884e8d8f..a6c9f24da 100644 --- a/source/de/anomic/server/serverObjects.java +++ b/source/de/anomic/server/serverObjects.java @@ -373,7 +373,7 @@ public class serverObjects extends HashMap implements Cloneable */ public String toString() { if (this.size() == 0) return ""; - StringBuilder param = new StringBuilder(); + StringBuilder param = new StringBuilder(this.size() * 40); for (Map.Entry entry: this.entrySet()) { param.append(MultiProtocolURI.escape(entry.getKey())); param.append('='); diff --git a/source/de/anomic/yacy/yacyPeerActions.java b/source/de/anomic/yacy/yacyPeerActions.java index c6eddd8cc..4a84bdc56 100644 --- a/source/de/anomic/yacy/yacyPeerActions.java +++ b/source/de/anomic/yacy/yacyPeerActions.java @@ -261,7 +261,7 @@ public class yacyPeerActions { try { final long mins = millis / 60000; - final StringBuilder uptime = new StringBuilder(); + final StringBuilder uptime = new StringBuilder(40); final int uptimeDays = (int) (Math.floor(mins/1440.0)); final int uptimeHours = (int) (Math.floor(mins/60.0)%24); @@ -271,7 +271,7 @@ public class yacyPeerActions { .append(((uptimeDays == 1)?" day ":" days ")) .append((uptimeHours < 10)?"0":"") .append(uptimeHours) - .append(":") + .append(':') .append((uptimeMins < 10)?"0":"") .append(uptimeMins); diff --git a/source/de/anomic/yacy/yacySearch.java b/source/de/anomic/yacy/yacySearch.java index 3e7307303..c1e2522a2 100644 --- a/source/de/anomic/yacy/yacySearch.java +++ b/source/de/anomic/yacy/yacySearch.java @@ -131,7 +131,7 @@ public class yacySearch extends Thread { } public static String set2string(final HandleSet hashes) { - StringBuilder wh = new StringBuilder(); + StringBuilder wh = new StringBuilder(hashes.size() * 12); final Iterator iter = hashes.iterator(); while (iter.hasNext()) { wh.append(UTF8.String(iter.next())); } return wh.toString(); diff --git a/source/net/yacy/YaCySearchClient.java b/source/net/yacy/YaCySearchClient.java index 55e642cd1..ae4d4295e 100644 --- a/source/net/yacy/YaCySearchClient.java +++ b/source/net/yacy/YaCySearchClient.java @@ -70,7 +70,7 @@ public class YaCySearchClient { public SearchResult() throws IOException { URL url; Document doc; - String u = new StringBuilder().append("http://") + String u = new StringBuilder(120).append("http://") .append(host) .append(":") .append(port) @@ -89,7 +89,7 @@ public class YaCySearchClient { @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(this.size() * 80 + 1); for (RSSEntry entry: this) sb.append(entry.toString()); return sb.toString(); } @@ -111,7 +111,7 @@ public class YaCySearchClient { @Override public String toString() { - return new StringBuilder().append("Title : ") + return new StringBuilder(80).append("Title : ") .append(title) .append("\nLink : ") .append(link) diff --git a/source/net/yacy/cora/document/JSONArray.java b/source/net/yacy/cora/document/JSONArray.java index badba4cd1..71be94e58 100644 --- a/source/net/yacy/cora/document/JSONArray.java +++ b/source/net/yacy/cora/document/JSONArray.java @@ -284,7 +284,7 @@ public class JSONArray { */ private String join(String separator) throws JSONException { int len = length(); - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(len * 20); for (int i = 0; i < len; i += 1) { if (i > 0) { diff --git a/source/net/yacy/cora/document/MultiProtocolURI.java b/source/net/yacy/cora/document/MultiProtocolURI.java index a7c09e95b..c126a9ecb 100644 --- a/source/net/yacy/cora/document/MultiProtocolURI.java +++ b/source/net/yacy/cora/document/MultiProtocolURI.java @@ -298,18 +298,18 @@ public class MultiProtocolURI implements Serializable, Comparable 0) { - for (int j = 0; j < d; j++) { - final char c = input.charAt(j); - if (!isBasic(c)) { - throw new PunycodeException(PunycodeException.BAD_INPUT); - } - output.append(c); - } - d++; + for (int j = 0; j < d; j++) { + final char c = input.charAt(j); + if (!isBasic(c)) { + throw new PunycodeException(PunycodeException.BAD_INPUT); + } + output.append(c); + } + d++; } else { - d = 0; + d = 0; } while (d < input.length()) { diff --git a/source/net/yacy/cora/document/RSSReader.java b/source/net/yacy/cora/document/RSSReader.java index 33f5f8591..a416c2a35 100644 --- a/source/net/yacy/cora/document/RSSReader.java +++ b/source/net/yacy/cora/document/RSSReader.java @@ -46,7 +46,7 @@ public class RSSReader extends DefaultHandler { private RSSReader(int maxsize) { theChannel = new RSSFeed(maxsize); - buffer = new StringBuilder(); + buffer = new StringBuilder(300); item = null; parsingChannel = false; parsingImage = false; diff --git a/source/net/yacy/document/Document.java b/source/net/yacy/document/Document.java index 00c4948b2..440d9a7a1 100644 --- a/source/net/yacy/document/Document.java +++ b/source/net/yacy/document/Document.java @@ -644,11 +644,11 @@ dc_rights long docTextLength = 0; final ByteBuffer content = new ByteBuffer(); - final StringBuilder authors = new StringBuilder(); - final StringBuilder publishers = new StringBuilder(); - final StringBuilder subjects = new StringBuilder(); - final StringBuilder title = new StringBuilder(); - final StringBuilder description = new StringBuilder(); + final StringBuilder authors = new StringBuilder(80); + final StringBuilder publishers = new StringBuilder(80); + final StringBuilder subjects = new StringBuilder(80); + final StringBuilder title = new StringBuilder(80); + final StringBuilder description = new StringBuilder(80); final LinkedList sectionTitles = new LinkedList(); final Map anchors = new HashMap(); diff --git a/source/net/yacy/document/SnippetExtractor.java b/source/net/yacy/document/SnippetExtractor.java index 58b15f493..21784b532 100644 --- a/source/net/yacy/document/SnippetExtractor.java +++ b/source/net/yacy/document/SnippetExtractor.java @@ -165,6 +165,7 @@ public class SnippetExtractor { // so cut it here at both ends at once assert maxpos >= minpos; final int newlen = Math.max(10, maxpos - minpos + 10); + assert maxLength >= newlen: "maxLength = " + maxLength + ", newlen = " + newlen; final int around = (maxLength - newlen) / 2; assert minpos - around < sentence.length() : "maxpos = " + maxpos + ", minpos = " + minpos + ", around = " + around + ", sentence.length() = " + sentence.length() + ", maxLength = " + maxLength + ", newlen = " + newlen; //maxpos = 435, minpos = 17, around = -124, sentence.length() = 44 sentence = "[..] " + sentence.substring(minpos - around, ((maxpos + around) > sentence.length()) ? sentence.length() : (maxpos + around)).trim() + " [..]"; diff --git a/source/net/yacy/document/content/SurrogateReader.java b/source/net/yacy/document/content/SurrogateReader.java index ab8fbd7be..bbca29d76 100644 --- a/source/net/yacy/document/content/SurrogateReader.java +++ b/source/net/yacy/document/content/SurrogateReader.java @@ -58,7 +58,7 @@ public class SurrogateReader extends DefaultHandler implements Runnable { private final InputStream stream; public SurrogateReader(final InputStream stream, int queueSize) throws IOException { - this.buffer = new StringBuilder(); + this.buffer = new StringBuilder(300); this.parsingValue = false; this.surrogate = null; this.elementName = null; diff --git a/source/net/yacy/document/parser/docParser.java b/source/net/yacy/document/parser/docParser.java index 3efe68f60..a1d586ad4 100644 --- a/source/net/yacy/document/parser/docParser.java +++ b/source/net/yacy/document/parser/docParser.java @@ -64,12 +64,12 @@ public class docParser extends AbstractParser implements Parser { throw new Parser.Failure("error in docParser, WordTextExtractorFactory: " + e.getMessage(), location); } - final StringBuilder contents = new StringBuilder(); + final StringBuilder contents = new StringBuilder(80); try { contents.append(extractor.getText().trim()); - contents.append(" "); + contents.append(' '); contents.append(extractor.getHeaderText()); - contents.append(" "); + contents.append(' '); contents.append(extractor.getFooterText()); } catch (Exception e) { throw new Parser.Failure("error in docParser, getText: " + e.getMessage(), location); diff --git a/source/net/yacy/document/parser/psParser.java b/source/net/yacy/document/parser/psParser.java index 88e8cf3a0..9a5551d37 100644 --- a/source/net/yacy/document/parser/psParser.java +++ b/source/net/yacy/document/parser/psParser.java @@ -66,7 +66,7 @@ public class psParser extends AbstractParser implements Parser { private boolean testForPs2Ascii() { try { String procOutputLine = null; - final StringBuilder procOutput = new StringBuilder(); + final StringBuilder procOutput = new StringBuilder(80); final Process ps2asciiProc = Runtime.getRuntime().exec(new String[]{"ps2ascii", "--version"}); final BufferedReader stdOut = new BufferedReader(new InputStreamReader(ps2asciiProc.getInputStream())); diff --git a/source/net/yacy/document/parser/sitemapParser.java b/source/net/yacy/document/parser/sitemapParser.java index d000a1401..10665e181 100644 --- a/source/net/yacy/document/parser/sitemapParser.java +++ b/source/net/yacy/document/parser/sitemapParser.java @@ -175,7 +175,7 @@ public class sitemapParser extends AbstractParser implements Parser { } @Override public String toString() { - final StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(300); for (final URLEntry entry: this) { sb.append(entry.toString()); } diff --git a/source/net/yacy/document/parser/torrentParser.java b/source/net/yacy/document/parser/torrentParser.java index dbb86624b..0d525bfcd 100644 --- a/source/net/yacy/document/parser/torrentParser.java +++ b/source/net/yacy/document/parser/torrentParser.java @@ -72,7 +72,7 @@ public class torrentParser extends AbstractParser implements Parser { final String comment = (commento == null) ? "" : UTF8.String(commento.getString()); //Date creation = new Date(map.get("creation date").getInteger()); final BObject infoo = map.get("info"); - final StringBuilder filenames = new StringBuilder(); + final StringBuilder filenames = new StringBuilder(80); String title = ""; if (infoo != null) { final Map info = infoo.getMap(); diff --git a/source/net/yacy/kelondro/blob/Tables.java b/source/net/yacy/kelondro/blob/Tables.java index 1026cf1d7..b8c5e72b1 100644 --- a/source/net/yacy/kelondro/blob/Tables.java +++ b/source/net/yacy/kelondro/blob/Tables.java @@ -459,7 +459,7 @@ public class Tables { @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(this.size() * 40); sb.append('{'); for (Map.Entry entry: this.entrySet()) { sb.append(entry.getKey()).append('=').append(UTF8.String(entry.getValue())).append(", "); diff --git a/source/net/yacy/kelondro/index/Column.java b/source/net/yacy/kelondro/index/Column.java index 320582821..a6d806c77 100644 --- a/source/net/yacy/kelondro/index/Column.java +++ b/source/net/yacy/kelondro/index/Column.java @@ -194,7 +194,7 @@ public final class Column { @Override public final String toString() { - final StringBuilder s = new StringBuilder(); + final StringBuilder s = new StringBuilder(20); switch (celltype) { case celltype_undefined: s.append(nickname); diff --git a/source/net/yacy/kelondro/index/Row.java b/source/net/yacy/kelondro/index/Row.java index 8309841b4..734419bf1 100644 --- a/source/net/yacy/kelondro/index/Row.java +++ b/source/net/yacy/kelondro/index/Row.java @@ -136,7 +136,7 @@ public final class Row { @Override public final String toString() { - final StringBuilder s = new StringBuilder(); + final StringBuilder s = new StringBuilder(80); s.append(row[0].toString()); for (int i = 1; i < row.length; i++) { s.append(", "); diff --git a/source/net/yacy/kelondro/index/RowCollection.java b/source/net/yacy/kelondro/index/RowCollection.java index 4f22b0221..3925e2a6e 100644 --- a/source/net/yacy/kelondro/index/RowCollection.java +++ b/source/net/yacy/kelondro/index/RowCollection.java @@ -1018,7 +1018,7 @@ public class RowCollection implements Iterable, Cloneable { } public synchronized String toString() { - final StringBuilder s = new StringBuilder(); + final StringBuilder s = new StringBuilder(80); final Iterator i = iterator(); if (i.hasNext()) s.append(i.next().toString()); while (i.hasNext()) s.append(", " + (i.next()).toString()); diff --git a/source/net/yacy/kelondro/logging/MiniLogFormatter.java b/source/net/yacy/kelondro/logging/MiniLogFormatter.java index 5a95e22bb..a220c599e 100644 --- a/source/net/yacy/kelondro/logging/MiniLogFormatter.java +++ b/source/net/yacy/kelondro/logging/MiniLogFormatter.java @@ -32,7 +32,7 @@ import java.util.logging.SimpleFormatter; public final class MiniLogFormatter extends SimpleFormatter { - private final StringBuilder buffer = new StringBuilder(); + private final StringBuilder buffer = new StringBuilder(80); public MiniLogFormatter() { super(); diff --git a/source/net/yacy/kelondro/util/BDecoder.java b/source/net/yacy/kelondro/util/BDecoder.java index 152dde300..49a3ab563 100644 --- a/source/net/yacy/kelondro/util/BDecoder.java +++ b/source/net/yacy/kelondro/util/BDecoder.java @@ -147,7 +147,7 @@ public class BDecoder { } @Override public String toString() { - StringBuilder s = new StringBuilder(); + StringBuilder s = new StringBuilder(l.size() * 40 + 1); s.append("["); for (BObject o: l) s.append(o.toString()).append(","); s.setLength(s.length() - 1); @@ -176,11 +176,11 @@ public class BDecoder { } @Override public String toString() { - StringBuilder s = new StringBuilder(); - s.append("{"); - for (Map.Entry e: m.entrySet()) s.append(e.getKey()).append(":").append(e.getValue().toString()).append(","); + StringBuilder s = new StringBuilder(m.size() * 40 + 1); + s.append('{'); + for (Map.Entry e: m.entrySet()) s.append(e.getKey()).append(':').append(e.getValue().toString()).append(','); s.setLength(s.length() - 1); - s.append("}"); + s.append('}'); return s.toString(); } public void toStream(OutputStream os) throws IOException { diff --git a/source/net/yacy/kelondro/util/FileUtils.java b/source/net/yacy/kelondro/util/FileUtils.java index e21acaca7..bcc30deb0 100644 --- a/source/net/yacy/kelondro/util/FileUtils.java +++ b/source/net/yacy/kelondro/util/FileUtils.java @@ -602,7 +602,7 @@ public final class FileUtils { * @return String representation of the file content. */ public static String getListString(final File listFile, final boolean withcomments){ - final StringBuilder temp = new StringBuilder(); + final StringBuilder temp = new StringBuilder(300); BufferedReader br = null; try{ @@ -726,7 +726,7 @@ public final class FileUtils { * @return returns true if successful, false otherwise */ public static boolean writeList(final File listFile, final String[] list){ - final StringBuilder out = new StringBuilder(); + final StringBuilder out = new StringBuilder(list.length * 40 + 1); for(int i=0;i < list.length; i++){ out.append(list[i]).append(CR).append(LF); } diff --git a/source/net/yacy/kelondro/util/MapTools.java b/source/net/yacy/kelondro/util/MapTools.java index 939cc78d5..5d7764490 100644 --- a/source/net/yacy/kelondro/util/MapTools.java +++ b/source/net/yacy/kelondro/util/MapTools.java @@ -109,8 +109,8 @@ public final class MapTools { } public static String set2string(final Set s, final String separator, final boolean braces) { - final StringBuilder buf = new StringBuilder(); - if (braces) buf.append("{"); + final StringBuilder buf = new StringBuilder(s.size() * 40 + 1); + if (braces) buf.append('{'); final Iterator i = s.iterator(); boolean hasNext = i.hasNext(); while (hasNext) { @@ -118,7 +118,7 @@ public final class MapTools { hasNext = i.hasNext(); if (hasNext) buf.append(separator); } - if (braces) buf.append("}"); + if (braces) buf.append('}'); return new String(buf); } diff --git a/source/net/yacy/kelondro/workflow/WorkflowProcessor.java b/source/net/yacy/kelondro/workflow/WorkflowProcessor.java index b5d6e408f..7a1765519 100644 --- a/source/net/yacy/kelondro/workflow/WorkflowProcessor.java +++ b/source/net/yacy/kelondro/workflow/WorkflowProcessor.java @@ -218,7 +218,7 @@ public class WorkflowProcessor { } public String getChilds() { - StringBuilder s = new StringBuilder(); + StringBuilder s = new StringBuilder(this.childs.length * 40 + 1); for (int i = 0; i < this.childs.length; i++) { s.append(this.childs[i]); s.append(' ');