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

Reply via email to