我运行了一个简单的测试来测量Java 9中的AES-GCM性能,方法是在循环中加密字节缓冲区。结果有些混乱。本机(硬件)加速似乎有效 - 但并非总是如此。进一步来说,
- 在循环中加密 1MB 缓冲区时,前约 50 秒的速度为约 60 MB/秒。然后它跳到 1100 MB/秒,并保持在那里。JVM 是否决定在 50 秒(或 3GB 数据)后激活硬件加速?可以配置吗?我在哪里可以了解新的AES-GCM实施(除了这里)。
- 加密 100MB 缓冲区时,硬件加速根本不会启动。速度为 60 MB/秒。
我的测试代码如下所示:
int plen = 1024*1024;
byte[] input = new byte[plen];
for (int i=0; i < input.length; i++) { input[i] = (byte)i;}
byte[] nonce = new byte[12];
...
// Uses SunJCE provider
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] key_code = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
SecretKey key = new SecretKeySpec(key_code, "AES");
SecureRandom random = new SecureRandom();
long total = 0;
while (true) {
random.nextBytes(nonce);
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] cipherText = cipher.doFinal(input);
total += plen;
// print delta_total/delta_time, once in a while
}
2019 年 2 月更新:已修改 HotSpot 以解决此问题。该修复适用于 Java 13,并且还向后移植到 Java 11 和 12。
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8201633 , https://hg.openjdk.java.net/jdk/jdk/rev/f35a8aaabcb9
2019 年 7 月 16 日更新:新发布的 Java 版本(Java 11.0.4)修复了这个问题。