RFR: 8256523: Streamline Java SHA2 implementation
Aleksey Shipilev
shade at openjdk.java.net
Fri Nov 20 06:49:02 UTC 2020
On Fri, 20 Nov 2020 00:14:55 GMT, Valerie Peng <valeriep at openjdk.org> wrote:
>> Current `sun/security/provider/SHA2` implementation is written with lots of small method invocations on the fastpath in `implCompress0`. Normally it does not matter much, because compilers are able to inline through it, and then some compilers even intrinsify the entire `implCompress0`.
>>
>> But it comes as major downside for platforms that do not have SHA2 intrinsics, or those VM configs that blindly interpret the bytecode. Zero, for example, keeps re-entering the small methods when computing SHA2 digests during jmod/jlink generation during the build, and spends significant time there. Linux x86_64 Zero fastdebug builds **improve from 18.5 minutes to 11.0 minutes** with this change, which is a major win for development experience.
>>
>> Note that SHA1 is already written in similar streamlined style. SHA5 is written with helper functions. This patch moves SHA2 to be closer to SHA1 style-wise.
>>
>> Performance improvement in interpreted modes is substantial, about 4x..5x, while compiler modes are not affected. As measured by: `make test TEST="micro:MessageDigests" MICRO="FORK=1;ITER=5;WARMUP_ITER=5;WARMUP_TIME=1s;TIME=1s;OPTIONS=-p digesterName=sha256 -p provider=SUN"`
>>
>> Before:
>>
>> Benchmark (digesterName) (length) (provider) Mode Cnt Score Error Units
>>
>> # Server, Default
>> MessageDigests.digest sha256 64 SUN thrpt 5 8585.532 ± 219.896 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 1545.994 ± 73.325 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 110.550 ± 1.576 ops/ms
>>
>> # Server, -XX:+UnlockDiagnosticVMOptions -XX:-UseSHA256Intrinsics
>> MessageDigests.digest sha256 64 SUN thrpt 5 1426.117 ± 48.320 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 188.779 ± 0.097 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 12.512 ± 1.371 ops/ms
>>
>> # Server, -Xint
>> MessageDigests.digest sha256 64 SUN thrpt 5 6.143 ± 0.126 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 0.769 ± 0.008 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 0.051 ± 0.001 ops/ms
>>
>> # Zero
>> MessageDigests.digest sha256 64 SUN thrpt 5 5.358 ± 0.664 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 0.686 ± 0.003 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 0.046 ± 0.001 ops/ms
>>
>> After:
>>
>> Benchmark (digesterName) (length) (provider) Mode Cnt Score Error Units
>>
>> # Server, Default
>> MessageDigests.digest sha256 64 SUN thrpt 5 8564.689 ± 1459.552 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 1548.582 ± 78.888 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 110.800 ± 0.057 ops/ms
>>
>> # Server, -XX:+UnlockDiagnosticVMOptions -XX:-UseSHA256Intrinsics
>> MessageDigests.digest sha256 64 SUN thrpt 5 1471.399 ± 66.622 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 186.297 ± 0.127 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 12.448 ± 0.099 ops/ms
>>
>> # Server, -Xint
>> MessageDigests.digest sha256 64 SUN thrpt 5 27.046 ± 0.304 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 3.538 ± 0.060 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 0.238 ± 0.002 ops/ms
>>
>> # Zero
>> MessageDigests.digest sha256 64 SUN thrpt 5 26.696 ± 0.968 ops/ms
>> MessageDigests.digest sha256 1024 SUN thrpt 5 3.655 ± 0.024 ops/ms
>> MessageDigests.digest sha256 16384 SUN thrpt 5 0.241 ± 0.002 ops/ms
>>
>> Addtional testing:
>> - [x] `jdk/security` with Linux x86_64 server fastdebug
>> - [x] `jdk/security` with Linux x86_64 zero fastdebug
>
> Changes look good.
Thank you, @valeriepeng. I am not sure what is the review policy for this code, should I wait for another reviewer?
-------------
PR: https://git.openjdk.java.net/jdk/pull/1283
More information about the security-dev
mailing list