我一直在测量内置于AES-NI指令中的java 11的性能,并且通过以下方式打开NI
JAVA_TOOL_OPTIONS -> -XX:+UnlockDiagnosticVMOptions -XX:+UseAES -XX:+UseAESIntrinsics
我通过开放的jdk本身运行基准测试
java -server -jar target/jmh-jdk-microbenchmarks-1.0-SNAPSHOT.jar org.openjdk.bench.javax.crypto.full.AESBench.encrypt -p algorithm=AES/ECB/NoPadding
当我比较结果并以GB / s为单位计算吞吐量时,对于16k编码块,与通过openssl性能测试进行的测试相比,我获得了大约20%的吞吐量
openssl speed -evp aes-128-ecb
。
我似乎找不到像样的比较/基准来描述预期使用jdk 11可获得的最大性能的百分比,但是20%似乎很低。是否有人知道比较(或者可能有一个想法,我哪里做错了,因为这些都是现成的性能工具,所以我认为在那儿可以调整的不多)。
作为参考,openssl测试报告以下内容:
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-ecb 825652.24k 3185957.03k 5251673.77k 5827996.33k 6027457.88k 6031906.13k
openjdk基准测试报告
Benchmark (algorithm) (dataSize) (keyLength) (provider) Mode Cnt Score Error Units
AESBench.encrypt AES/ECB/NoPadding 16384 128 thrpt 40 84543.829 ± 9034.592 ops/s
其中我得出的结论是,对于16k块,这里的性能为85000 * 16k或约1.4 GB / s,或约openssl数量的20%。
这是预期的还是我得出了错误的结论?