On Wed, 2005-11-02 at 11:31 +0100, Christian Thalinger wrote: > On Tue, 2005-11-01 at 22:16 +0100, Mark Wielaard wrote: > > That seems like an significant improvement. Could you test with a larger > > dataset (or just run the test in a loop 10 times)? I still haven't tried > > with gcj. If someone could test, that would be super. I believe gcj has > > really slow monitor enter and exit support so the speedup should be > > significant there. But without testing... > > In a 10 times loop (fastest of 3 runs): > > w/o: 13.92user > w/: 10.14user
And I finally tested against gcj. Before: 0m3.765s After: 0m2.370s (Best of 3 for reading all classpath property files 4 times) So this seems like a nice optimization and I am checking it in as: 2005-11-11 Mark Wielaard <[EMAIL PROTECTED]> Anthony Green <[EMAIL PROTECTED]> * java/util/Properties.java (load): Short-circuit parsing when key or value doesn't contain escape character. Use StringBuilder instead of StringBuffer. (store): Use StringBuilder instead of StringBuffer. (formatForOutput): Likewise. Cheers, Mark
Index: java/util/Properties.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/util/Properties.java,v retrieving revision 1.34 diff -u -r1.34 Properties.java --- java/util/Properties.java 23 Oct 2005 21:56:31 -0000 1.34 +++ java/util/Properties.java 30 Oct 2005 11:09:05 -0000 @@ -219,12 +219,15 @@ // The characters up to the next Whitespace, ':', or '=' // describe the key. But look for escape sequences. - StringBuffer key = new StringBuffer(); + // Try to short-circuit when there is no escape char. + int start = pos; + boolean needsEscape = line.indexOf('\\', pos) != -1; + StringBuilder key = needsEscape ? new StringBuilder() : null; while (pos < line.length() && ! Character.isWhitespace(c = line.charAt(pos++)) && c != '=' && c != ':') { - if (c == '\\') + if (needsEscape && c == '\\') { if (pos == line.length()) { @@ -268,11 +271,20 @@ } } } - else + else if (needsEscape) key.append(c); } boolean isDelim = (c == ':' || c == '='); + + String keyString; + if (needsEscape) + keyString = key.toString(); + else if (isDelim || Character.isWhitespace(c)) + keyString = line.substring(start, pos - 1); + else + keyString = line.substring(start, pos); + while (pos < line.length() && Character.isWhitespace(c = line.charAt(pos))) pos++; @@ -285,7 +297,15 @@ pos++; } - StringBuffer element = new StringBuffer(line.length() - pos); + // Short-circuit if no escape chars found. + if (!needsEscape) + { + put(keyString, line.substring(pos)); + continue; + } + + // Escape char found so iterate through the rest of the line. + StringBuilder element = new StringBuilder(line.length() - pos); while (pos < line.length()) { c = line.charAt(pos++); @@ -341,7 +361,7 @@ else element.append(c); } - put(key.toString(), element.toString()); + put(keyString, element.toString()); } } @@ -405,7 +425,7 @@ Iterator iter = entrySet ().iterator (); int i = size (); - StringBuffer s = new StringBuffer (); // Reuse the same buffer. + StringBuilder s = new StringBuilder (); // Reuse the same buffer. while (--i >= 0) { Map.Entry entry = (Map.Entry) iter.next (); @@ -548,7 +568,7 @@ * leading spaces must be escaped for the value * @see #store(OutputStream, String) */ - private void formatForOutput(String str, StringBuffer buffer, boolean key) + private void formatForOutput(String str, StringBuilder buffer, boolean key) { if (key) {
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Classpath-patches mailing list Classpath-patches@gnu.org http://lists.gnu.org/mailman/listinfo/classpath-patches