[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