[10] RFR: 8176041: Optimize handling of comment lines in Properties$LineReader.readLine

Xueming Shen xueming.shen at oracle.com
Wed Mar 1 17:32:54 UTC 2017


+1

On 3/1/17 9:11 AM, Claes Redestad wrote:
> 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
>>
>



More information about the core-libs-dev mailing list