On Wed, 18 Nov 2020 08:29:49 GMT, Aleksey Shipilev <sh...@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 Sounds impressive, I will take a look. Thanks! ------------- PR: https://git.openjdk.java.net/jdk/pull/1283