RFR: 8239138: StyleManager should use a BufferedInputStream [v2]
Kevin Rushforth
kcr at openjdk.java.net
Thu May 27 13:02:09 UTC 2021
On Thu, 27 May 2021 02:14:32 GMT, Ambarish Rapte <arapte at openjdk.org> wrote:
>> `StyleManager.calculateCheckSum()` uses a raw InputStream as the input to a `DigestInputStream` and reads one byte at a time. This is slower in performance and should be changed, either to use `BufferedInputStream` or read byte buffer of 4096 from the stream or use both.
>>
>> I have tried three approaches and tested with modena.css which is ~134 KB in size.
>> Following are the approaches and time in milliseconds taken by the method StyleManager.calculateCheckSum(), collected from 25 readings,
>>
>> 1. Use BufferedInputStream and read one byte at a time [commit#1](https://github.com/openjdk/jfx/commit/6cd7d44d0ce1084c6cdb06a698c7aca127a615ef) :
>> - Maximum: 53 ms, Minimum: 27 ms, Average: 39 ms
>> 2. Use BufferedInputStream and read buffer of 4096 at a time [commit#1+2](https://github.com/openjdk/jfx/pull/518/files/6e0c621ea62691d5402b2bca5951d1012a5b1b91)
>> - Maximum: 17 ms, Minimum: 14 ms, Average: 15.58 ms
>> 3. Use raw InputStream(current implementation) and read buffer of 4096 at a time [commit#1+2+3](https://github.com/openjdk/jfx/pull/518/files/215e1a183cfb902247f0d48685f7a901cb5fb003), which also similar to `NativeLibLoader.calculateCheckSum()` and looks faster than previous two.
>> - Maximum: 16 ms, Minimum: 13 ms, Average: 14.25 ms
>>
>>
>> The time taken by `StyleManager.calculateCheckSum()` with current implementation is,
>> - Maximum: 61 ms, Minimum: 38 ms, Average: 50.58 ms
>>
>>
>> Both approaches 2 & 3 show good improvement. I would prefer approach#3 as it is similar to `NativeLibLoader.calculateCheckSum()`.
>> However we can choose approach#2 also.
>> If we choose approach#3 then bug summary should be changed accordingly.
>
> Ambarish Rapte has updated the pull request incrementally with two additional commits since the last revision:
>
> - minor: format correction
> - add test
The new test looks like it will work, but maybe could be made a bit clearer?
modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/StyleManagerTest.java line 1121:
> 1119: actualChecksum += Integer.toString((b & 0xff) + 0x100, 16).substring(1);
> 1120: }
> 1121: assertEquals(expectedChecksum, actualChecksum);
It might be clearer to use a `byte` array for the expected checksum and use `Arrays.equals()` to compare them rather than converting to a `String`. I'm scratching my head over the formula in the `Integer.toString` call.
modules/javafx.graphics/src/test/resources/test/com/sun/javafx/css/checksum.css line 1:
> 1:
This file should have a copyright header.
-------------
PR: https://git.openjdk.java.net/jfx/pull/518
More information about the openjfx-dev
mailing list