Я пытаюсь измерить скорость различных алгоритмов шифрования. Я думал, что начну с регистрации текущего времени (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
(я использовал фрагмент кода, чтобы сохранить форматирование моих результатов)
Я не знаю, почему последующие результаты произойдет так быстро, или почему время не считая как это должен или что-то. Есть ли вероятность того, что происходит кеширование данных, что ускоряет процесс?
Я добавил еще больше циклов, и каждая последующая итерация стала меньше последней.
Большое спасибо
Это точно ожидаемое поведение на Java, и почему вы никогда не должны писать свои собственные тесты с нуля: компилятор JIT будет оптимизировать ваши функции больше, поскольку они запускаются больше. Это ненормально, и почему вы должны полагаться на существующую базовую платформу; –
'' init'' выполняется только в первый раз. Вторая операция выполняется так быстро: '' kgen'' уже инициализирован. –