为什么加密的第一个调用要花费第二个的一百倍

byte[] key = //... secret sequence of bytes
byte[] dataToSend = ...


这是我的加密方法:

public static byte[] enc(byte data[], byte key[]
{
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k =
  new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(dataToSend);
return encryptedData;
}


这是测试代码

byte [] key="1111111111111111".toByteArray();
byte [] data=new byte [32];
for(int i=0;i<1000;i++)
{
long x=System.nanoTime();
enc(data,key);
System.out.println(System.nanoTime()-x);

}


第一个值将是20300,
然后另一个值将降至50、35、42等
如果它需要加载某些东西,我可以在启动应用程序之前执行此操作。我正在网络协议中工作,需要与另一个进行基准测试。

最佳答案

第一个值将类似于20300,然后另一个值将降至50,35,42


进行基准测试时,您需要考虑执行环境在后台发生的一些影响,例如


缓存效果(在运行时库级别的CPU级别上)
预热效果-特别是对于Java,JIT编译器不一定会在首次执行时将所有字节代码都编译为本机代码,而只有在多次执行同一代码时才将其编译为本机代码。


通常,在开始进行基准测试之前,您需要执行几次代码,以使这些影响不会影响实际的测量结果。

也可以看看


How do I write a correct micro-benchmark in Java?
Avoid jvm warmup

07-24 13:26