为什么第一次枚举加密数据需要这么长时间

胡迪

我想创建性能测试,在其中我要通过PKCPadding5 / 7使用AES加密数据,这取决于aix系统上的提供程序(IBM或BouncyCastle)。我的问题是,为什么第一次枚举这么慢而其他那么快?

当我使用参数运行测试时:

Padding: AES/CBC/PKCS7Padding
Provider: BC version 1.47
Number of iteration: 1000

结果是:

Time: 392080057 ns
Time: 174662 ns
Time: 160906 ns
Time: 169938 ns
Time: 154344 ns
Time: 155125 ns
Time: 157344 ns
Time: 157203 ns
Time: 157611 ns
Time: 158123 ns

参数

Padding: AES/CBC/PKCS5Padding
Provider: IBMJCE version 1.7
Number of iteration: 1000

结果是:

Time: 13410344 ns
Time: 185007 ns
Time: 182562 ns
Time: 170687 ns
Time: 203156 ns
Time: 189980 ns
Time: 182608 ns
Time: 174670 ns
Time: 176842 ns
Time: 174463 ns

代码:

for (int j = 0; j < pocetIteraci; j++) {
    String text = randomString(46);

    long time = System.currentTimeMillis();
    sifruj(padding, provider, generateVectot(),text);

    time = System.currentTimeMillis() - time;
    System.out.println("Time: " + time + " ms");
}

public static byte[] sifruj(String padding, Provider provider, IvParameterSpec finalniInicializacniVektor,String text)
        throws Exception {
    return zpracuj(padding, provider, text.getBytes("UTF-8"), finalniInicializacniVektor, Cipher.ENCRYPT_MODE);
}

public static byte[] zpracuj(String padding, Provider provider, byte[] data,
        IvParameterSpec finalniInicializacniVektor, int mode) throws Exception {
    final SecretKeySpec klicSpec = new SecretKeySpec(klic, ALGORITHM_AES);
    final Cipher sifra = Cipher.getInstance(padding, provider);
    sifra.init(mode, klicSpec, finalniInicializacniVektor);

    return sifra.doFinal(data);

}

更新:

创建密码的第一个实例时,最大的不同(正如我预期的那样):

long timeTemp = System.nanoTime();
final Cipher sifra = Cipher.getInstance(padding, provider);
timeTemp = System.nanoTime() - timeTemp;
System.out.println("XXXXXXXXXXXXXXXXX " + timeTemp + " ns");

为什么?

乔恩·斯基特

修改后的答案

在第一次调用时需要花费一些时间来加载和JIT编译代码-这就是为什么基准测试通常不包含第一次运行的原因。(实际上,许多JVM越来越积极地重新进行JIT,因此性能会随着时间的推移而提高-因此,良好的基准测试会在计时之前多次运行代码。)

此外,认为加密提供者可以很好地进行一次一次性设置并不是没有道理的,特别是如果加密提供者正在尽力获得一些体面的熵的话。SecureRandom例如,它可能在内部使用。)您可能想对Cipher.getInstanceCipher.initCypher.doFinal方法调用分别计时,以确定哪个是速度较慢的部分。

最后,您没有向我们展示所有代码(generateVectot?),所以可能有些东西潜伏在那里。

最初的答案

显然randomString是:

一个简单的函数,它生成具有一定长度的随机字符串,是的是使用SecureRandom,该实例仅创建一次

鉴于您正在寻找昂贵的东西(就像创建和使用SecureRandom实例一样),并且只会发生一次,所以这听起来像是我的烟枪。

我建议您在其中添加时间(使用System.nanoTime,而不是System.currentTimeMillisrandomString来测试该假设。


我也强烈建议您不要使用String.getBytes平台默认编码的重载-而是始终明确指定编码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是“加载符号”,为什么第一次需要这么长时间?

来自分类Dev

为什么用Robolectric进行的第一次测试需要这么长时间?

来自分类Dev

为什么我的程序第一次访问文件需要很长时间

来自分类Dev

为什么asp.net web api请求第一次需要时间?

来自分类Dev

第一次上传文件需要很长时间,ASP.NET

来自分类Dev

平方根方法需要很长时间才能执行第一次尝试

来自分类Dev

Java 8 流,仅第一次获取 max() 需要很长时间

来自分类Dev

为什么User.first会花更多时间第一次查询数据库?

来自分类Dev

为什么排序需要这么长时间?

来自分类Dev

为什么mkntfs需要这么长时间?

来自分类Dev

为什么 IndexOrDocValuesQuery 需要这么长时间?

来自分类Dev

为什么我的显示隐藏按钮第一次需要双击

来自分类Dev

为什么第一次收费很重要

来自分类Dev

为什么在第一次迭代后就停止了?

来自分类Dev

为什么我的PXSmartPanel第一次执行后不能显示正确的数据?

来自分类Dev

第一次加载任何浏览器都花费太长时间

来自分类Dev

为什么setTimeout()第一次只运行一次我的代码?

来自分类Dev

为什么此GAS脚本需要这么长时间才能加载数据验证选项?

来自分类Dev

为什么Disk Utility / diskutil需要这么长时间才能将数据归零?

来自分类Dev

为什么我的程序需要这么长时间才能运行?

来自分类Dev

为什么嵌套的for循环需要这么长时间才能计算?

来自分类Dev

为什么从Visual Studio部署Azure需要这么长时间?

来自分类Dev

为什么创建表格需要这么长时间?

来自分类Dev

为什么docker build需要这么长时间才能运行?

来自分类Dev

Postgres:为什么选择count(*)需要这么长时间

来自分类Dev

为什么删除Kafka主题需要这么长时间?

来自分类Dev

为什么Windows 7更新需要这么长时间安装?

来自分类Dev

为什么sencha touch需要这么长时间才能加载?

来自分类Dev

为什么更新包需要这么长时间?

Related 相关文章

  1. 1

    什么是“加载符号”,为什么第一次需要这么长时间?

  2. 2

    为什么用Robolectric进行的第一次测试需要这么长时间?

  3. 3

    为什么我的程序第一次访问文件需要很长时间

  4. 4

    为什么asp.net web api请求第一次需要时间?

  5. 5

    第一次上传文件需要很长时间,ASP.NET

  6. 6

    平方根方法需要很长时间才能执行第一次尝试

  7. 7

    Java 8 流,仅第一次获取 max() 需要很长时间

  8. 8

    为什么User.first会花更多时间第一次查询数据库?

  9. 9

    为什么排序需要这么长时间?

  10. 10

    为什么mkntfs需要这么长时间?

  11. 11

    为什么 IndexOrDocValuesQuery 需要这么长时间?

  12. 12

    为什么我的显示隐藏按钮第一次需要双击

  13. 13

    为什么第一次收费很重要

  14. 14

    为什么在第一次迭代后就停止了?

  15. 15

    为什么我的PXSmartPanel第一次执行后不能显示正确的数据?

  16. 16

    第一次加载任何浏览器都花费太长时间

  17. 17

    为什么setTimeout()第一次只运行一次我的代码?

  18. 18

    为什么此GAS脚本需要这么长时间才能加载数据验证选项?

  19. 19

    为什么Disk Utility / diskutil需要这么长时间才能将数据归零?

  20. 20

    为什么我的程序需要这么长时间才能运行?

  21. 21

    为什么嵌套的for循环需要这么长时间才能计算?

  22. 22

    为什么从Visual Studio部署Azure需要这么长时间?

  23. 23

    为什么创建表格需要这么长时间?

  24. 24

    为什么docker build需要这么长时间才能运行?

  25. 25

    Postgres:为什么选择count(*)需要这么长时间

  26. 26

    为什么删除Kafka主题需要这么长时间?

  27. 27

    为什么Windows 7更新需要这么长时间安装?

  28. 28

    为什么sencha touch需要这么长时间才能加载?

  29. 29

    为什么更新包需要这么长时间?

热门标签

归档