我正在尝试测量不同加密算法的速度。我想我应该从记录当前时间(纳米或毫)开始,然后运行所需的操作,完成后,获取时间并进行比较。
这一切都在一次迭代中有效,但是一旦我尝试添加一个循环来自动测试多个算法,数字就不会相加。
public static void main(String[] args) throws Exception {
Map<String, int[]> algorKey = new HashMap<String, int[]>() {
{
put("AES", new int[] { 128 });
put("DES", new int[] { 56 });
}
};
Iterator it = algorKey.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
String algorithm = (String) pairs.getKey();
int[] keyLengths = (int[]) pairs.getValue();
for (int i = 0; i < keyLengths.length; i++) {
int keySize = keyLengths[i];
Long startT = System.nanoTime();
System.out.println(startT);
// Generate key
KeyGenerator kgen = KeyGenerator.getInstance(algorithm);
kgen.init(keySize);
SecretKey key = kgen.generateKey();
Long endT = System.nanoTime();
System.out.println(endT);
System.out.print("Algorithm: " + algorithm + "\nKey Size: "
+ keySize + "\nTime to Generate: " + (endT - startT)
/ 1000000 + "ms\n\n");
}
}
}
结果如下,第一个结果是正确的(我单独测试了两种算法),但第二个结果太小了。
11223817758736
11224385930995
Algorithm: DES
Key Size: 56
Time to Generate: 568ms
11224386324864
11224401644040
Algorithm: AES
Key Size: 128
Time to Generate: 15ms
(我使用代码片段来保持结果的格式)
我不知道为什么后续结果发生得这么快,或者为什么时间没有按应有的计算或其他什么。是否有可能存在数据缓存来加速该过程?
我添加了更多的循环,并且每次后续迭代都比上一次更小。
非常感谢
最佳答案
我确实相信您应该测试算法,在每个循环中使用新的 jvm 打开一个新进程。我认为错误的测量是在第一个循环中加载类和运行时的结果。
也许最好的方法是在不测量时运行循环,然后在设置整个代码和依赖项后进行真正的测量。
关于java - java 循环中使用的 nanoTime 和 currentMilliSeconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896112/