8077242: (str) Optimize AbstractStringBuilder.append(CharSequence, int, int) for String argument

Reviewed-by: martin
This commit is contained in:
Ivan Gerasimov 2015-07-02 00:26:35 +03:00
parent 3fac3ec9da
commit 0e510a1f61
12 changed files with 30 additions and 26 deletions
jdk/src/java.base
share/classes
unix/classes/java/io
windows/classes/java/io

@ -1235,7 +1235,7 @@ class Attribute implements Comparable<Attribute> {
int sofar = 0; // how far have we processed the layout?
for (;;) {
// for each dash, collect everything up to the dash
result.append(layout.substring(sofar, dash));
result.append(layout, sofar, dash);
sofar = dash+1; // skip the dash
// then collect intermediate values
int value0 = parseIntBefore(layout, dash);
@ -1249,7 +1249,7 @@ class Attribute implements Comparable<Attribute> {
dash = findCaseDash(layout, sofar);
if (dash < 0) break;
}
result.append(layout.substring(sofar)); // collect the rest
result.append(layout, sofar, layout.length()); // collect the rest
return result.toString();
}
static {

@ -109,7 +109,7 @@ public class StringWriter extends Writer {
* @param len Number of characters to write
*/
public void write(String str, int off, int len) {
buf.append(str.substring(off, off + len));
buf.append(str, off, off + len);
}
/**

@ -515,8 +515,12 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
+ s.length());
int len = end - start;
ensureCapacityInternal(count + len);
for (int i = start, j = count; i < end; i++, j++)
value[j] = s.charAt(i);
if (s instanceof String) {
((String)s).getChars(start, end, value, count);
} else {
for (int i = start, j = count; i < end; i++, j++)
value[j] = s.charAt(i);
}
count += len;
return this;
}

@ -2018,7 +2018,7 @@ public final class URI
StringBuilder sb = new StringBuilder(base.length() + cn);
// 5.2 (6a)
if (i >= 0)
sb.append(base.substring(0, i + 1));
sb.append(base, 0, i + 1);
// 5.2 (6b)
sb.append(child);
path = sb.toString();
@ -2686,7 +2686,7 @@ public final class URI
if (!match(c, lowMask, highMask)) {
if (sb == null) {
sb = new StringBuffer();
sb.append(s.substring(0, i));
sb.append(s, 0, i);
}
appendEscape(sb, (byte)c);
} else {
@ -2698,7 +2698,7 @@ public final class URI
|| Character.isISOControl(c))) {
if (sb == null) {
sb = new StringBuffer();
sb.append(s.substring(0, i));
sb.append(s, 0, i);
}
appendEncoded(sb, c);
} else {

@ -329,8 +329,8 @@ final class MergeCollation {
PatternEntry e = patterns.get(i);
if (e.chars.regionMatches(0,entry.chars,0,
e.chars.length())) {
excessChars.append(entry.chars.substring(e.chars.length(),
entry.chars.length()));
excessChars.append(entry.chars, e.chars.length(),
entry.chars.length());
break;
}
}

@ -1239,7 +1239,7 @@ public class MessageFormat extends Format {
int lastOffset = 0;
int last = result.length();
for (int i = 0; i <= maxOffset; ++i) {
result.append(pattern.substring(lastOffset, offsets[i]));
result.append(pattern, lastOffset, offsets[i]);
lastOffset = offsets[i];
int argumentNumber = argumentNumbers[i];
if (arguments == null || argumentNumber >= arguments.length) {
@ -1332,7 +1332,7 @@ public class MessageFormat extends Format {
}
}
}
result.append(pattern.substring(lastOffset, pattern.length()));
result.append(pattern, lastOffset, pattern.length());
if (characterIterators != null && last != result.length()) {
characterIterators.add(createAttributedCharacterIterator(
result.substring(last)));

@ -511,7 +511,7 @@ public class BytecodeName {
if (s.charAt(0) != ESCAPE_C && i > 0)
sb.append(NULL_ESCAPE);
// append the string so far, which is unremarkable:
sb.append(s.substring(0, i));
sb.append(s, 0, i);
}
// rewrite \ to \-, / to \|, etc.
@ -544,7 +544,7 @@ public class BytecodeName {
if (sb == null) {
sb = new StringBuilder(s.length());
// append the string so far, which is unremarkable:
sb.append(s.substring(stringStart, i));
sb.append(s, stringStart, i);
}
++i; // skip both characters
c = oc;

@ -451,7 +451,7 @@ public class ParseUtil {
if (!match(c, lowMask, highMask) && !isEscaped(s, i)) {
if (sb == null) {
sb = new StringBuffer();
sb.append(s.substring(0, i));
sb.append(s, 0, i);
}
appendEscape(sb, (byte)c);
} else {
@ -463,7 +463,7 @@ public class ParseUtil {
|| Character.isISOControl(c))) {
if (sb == null) {
sb = new StringBuffer();
sb.append(s.substring(0, i));
sb.append(s, 0, i);
}
appendEncoded(sb, c);
} else {

@ -1850,7 +1850,7 @@ public class UnicodeSet implements UnicodeMatcher {
syntaxError(chars, "Invalid property pattern");
}
chars.jumpahead(pos.getIndex());
rebuiltPat.append(patStr.substring(0, pos.getIndex()));
rebuiltPat.append(patStr, 0, pos.getIndex());
}
//----------------------------------------------------------------

@ -242,12 +242,13 @@ public class BuddhistCalendar extends GregorianCalendar {
return s;
}
p += yearField.length();
StringBuilder sb = new StringBuilder(s.substring(0, p));
StringBuilder sb = new StringBuilder(s.length() + 10);
sb.append(s, 0, p);
// Skip the year number
while (Character.isDigit(s.charAt(p++)))
;
int year = internalGet(YEAR) + BUDDHIST_YEAR_OFFSET;
sb.append(year).append(s.substring(p - 1));
sb.append(year).append(s, p - 1, s.length());
return sb.toString();
}

@ -65,8 +65,8 @@ class UnixFileSystem extends FileSystem {
int n = len;
while ((n > 0) && (pathname.charAt(n - 1) == '/')) n--;
if (n == 0) return "/";
StringBuffer sb = new StringBuffer(pathname.length());
if (off > 0) sb.append(pathname.substring(0, off));
StringBuilder sb = new StringBuilder(pathname.length());
if (off > 0) sb.append(pathname, 0, off);
char prevChar = 0;
for (int i = off; i < n; i++) {
char c = pathname.charAt(i);

@ -104,7 +104,7 @@ class WinNTFileSystem extends FileSystem {
if (off < 3) off = 0; /* Avoid fencepost cases with UNC pathnames */
int src;
char slash = this.slash;
StringBuffer sb = new StringBuffer(len);
StringBuilder sb = new StringBuilder(len);
if (off == 0) {
/* Complete normalization, including prefix */
@ -112,7 +112,7 @@ class WinNTFileSystem extends FileSystem {
} else {
/* Partial normalization */
src = off;
sb.append(path.substring(0, off));
sb.append(path, 0, off);
}
/* Remove redundant slashes from the remainder of the path, forcing all
@ -156,8 +156,7 @@ class WinNTFileSystem extends FileSystem {
}
}
String rv = sb.toString();
return rv;
return sb.toString();
}
/* A normal Win32 pathname contains no duplicate slashes, except possibly
@ -172,7 +171,7 @@ class WinNTFileSystem extends FileSystem {
else directory-relative (has form "z:foo")
3 absolute local pathname (begins with "z:\\")
*/
private int normalizePrefix(String path, int len, StringBuffer sb) {
private int normalizePrefix(String path, int len, StringBuilder sb) {
int src = 0;
while ((src < len) && isSlash(path.charAt(src))) src++;
char c;