On Fri, 20 Nov 2020 00:14:55 GMT, Valerie Peng <valer...@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