Hi Aleksey!

On 03/01/2017 03:40 PM, Aleksey Shipilev wrote:
On 03/01/2017 04:34 PM, Claes Redestad wrote:
the properties line reader has some relevance to startup, e.g.,
when reading the java.security file, and as more documentation
content has been added to this file it has been made apparent
that the handling of comment lines is inefficient due to treating
every character after a comment line marker ('#' or '!') as any
other character (writes it to an internal buffer etc) when a
fast-path consuming the rest of the line would do.

Bug: https://bugs.openjdk.java.net/browse/JDK-8176041
Webrev: http://cr.openjdk.java.net/~redestad/8176041/jdk.01
The idea looks fine.

I think you can go further and unswitch the loop, saving branch in a hot loop,
and using byte comparisons (may require some work to do efficient byte-char
comparisons):

     if (inStream != null) {
        while (inOff < inLimit) {
           byte b = inByteBuf[inOff++];
           if (b == '\n' || b == '\r' || b == '\\') {
              break;
           }
        }
     } else {
        while (inOff < inLimit) {
           c = inCharBuf[inOff++];
           if (c == '\n' || c == '\r' || c == '\\') {
              break;
           }
        }
     }

Sure, with a bit of fix-up this drops another 170k executed bytecodes
to read in the java.security file (original: 1882k, now: 980k):

http://cr.openjdk.java.net/~redestad/8176041/jdk.02/

It seems javac optimizes byte-char comparisons pretty well in this
case since the chars we're comparing against are all in the 0-127 range,
so I don't think there's much we can do:

       256: getfield      #7                  // Field inByteBuf:[B
       259: aload_0
       260: dup
       261: getfield      #5                  // Field inOff:I
       264: dup_x1
       265: iconst_1
       266: iadd
       267: putfield      #5                  // Field inOff:I
       270: baload
       271: istore        9
       273: iload         9
       275: bipush        10     <- '\n'
       277: if_icmpeq     294
       280: iload         9
       282: bipush        13  <- '\r'
       284: if_icmpeq     294
       287: iload         9
       289: bipush        92   <- '\\'

Thanks!

/Claes


Thanks,
-Aleksey


Reply via email to