2014-11-12 2 views
1

Я пытаюсь измерить скорость различных алгоритмов шифрования. Я думал, что начну с регистрации текущего времени (nano или milli), а затем выполните необходимые действия, после того, как вы сделали, захватите время и сравните.nanoTime & currentMilliSeconds, используемые в цикле в java

Все это работало на одну итерацию, но как только я попытаюсь добавить цикл для автоматического тестирования нескольких алгоритмов, цифры не складываются.

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

(я использовал фрагмент кода, чтобы сохранить форматирование моих результатов)

Я не знаю, почему последующие результаты произойдет так быстро, или почему время не считая как это должен или что-то. Есть ли вероятность того, что происходит кеширование данных, что ускоряет процесс?

Я добавил еще больше циклов, и каждая последующая итерация стала меньше последней.

Большое спасибо

+2

Это точно ожидаемое поведение на Java, и почему вы никогда не должны писать свои собственные тесты с нуля: компилятор JIT будет оптимизировать ваши функции больше, поскольку они запускаются больше. Это ненормально, и почему вы должны полагаться на существующую базовую платформу; –

+0

'' init'' выполняется только в первый раз. Вторая операция выполняется так быстро: '' kgen'' уже инициализирован. –

ответ

0

Я действительно верю, что вы должны проверить алгоритмы открытия нового процесса с новым JVM в каждом цикле. Я думаю, что неправильное измерение является результатом того, что классы и среда выполнения загружаются в первом цикле.

Возможно, лучший способ можно запустить цикл, не измеряя, а затем выполнить реальное измерение после установки всего кода и зависимостей.

+0

Как вы начинаете новый процесс в новом JVM каждом цикле? – colobusgem

+0

С runtime exec или с завернутой в подарок версией http://commons.apache.org/proper/commons-exec/ – eduyayo