1

我正在尝试测量不同加密算法的速度。我想我会从记录当前时间(纳米或毫)开始,然后运行所需的操作,一旦完成,抓住时间并进行比较。

这一切都适用于一次迭代,但是一旦我尝试添加一个循环来自动测试多种算法,这些数字就不会加起来。

 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

(我使用片段来保持结果的格式)

我不确定为什么随后的结果发生得如此之快,或者为什么时间没有按应有的方式计算或其他什么。是否有可能正在缓存数据以加快该过程?

我添加了更多循环,并且每次后续迭代都比上一次小。

非常感谢

4

1 回答 1

0

我真的相信你应该在每个循环中用一个新的 jvm 来测试打开一个新进程的算法。我认为错误的测量是在第一个循环中加载类和运行时的结果。

也许最好的方法是在不测量时运行循环,然后在设置整个代码和依赖项后进行真正的测量。

于 2014-11-12T20:52:40.277 回答