2013-06-14 2 views
0

Почему первый вызов шифрования займет сто время второгоAES Производительность в Java

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 ..etc Если что-то, что нужно загрузить, я могу сделать это перед запуском приложения. Я работаю в сетевом протоколе, и мне нужно сделать сравнение с другим.

+0

этот код не копировать вставить. Я написал этот код здесь, поэтому ошибка компиляции my существует – primeFaceUser

+3

'Первое значение будет примерно 20300, тогда другое значение уменьшится до 50, 35, 42' - вам, возможно, придется ознакомиться с эффектами разминки и кеширования JVM –

+2

Шансы что весь набор классов, необходимых для AES, загружается в первую итерацию. Это также объясняет часть огромной разницы. –

ответ

2

Первое значение будет что-то вроде 20300, то другое значение упадет до 50, 35, 42

При выполнении сравнительного анализа, необходимо рассмотреть некоторые эффекты среды выполнения, которые имеют место в фоновом режиме, такие как

  • Кэширование эффекты (как на уровне процессора на уровне библиотеки времени выполнения)
  • эффектов - разминки, в частности, для Java, ЛТ-компилятор не necessar ily скомпилировать весь байтовый код в собственный код при первом запуске, но только тогда, когда один и тот же код выполняется несколько раз.

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

Смотрите также

+1

Спасибо, это отличная информация. Аналогичное сообщение о [avoid jwm warmup] (http://stackoverflow.com/questions/4345999/avoid-jvm-warmup) можно отнести для дальнейшего понимания. – asgs

+0

Я делаю 5 экспериментов из 1000 запросов/ответов на мой протокол. также оба протокола написаны на java. – primeFaceUser