RFR: 8256523: Streamline Java SHA2 implementation
Valerie Peng
valeriep at openjdk.java.net
Fri Nov 20 00:18:05 UTC 2020
On Wed, 18 Nov 2020 08:29:49 GMT, Aleksey Shipilev <shade 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.
-------------
Marked as reviewed by valeriep (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/1283
More information about the security-dev
mailing list