Время, затраченное на HashMap get(), больше в первый раз

Я проводил некоторые проверки производительности с помощью HashMap на Java. Результаты удивительны, я должен сказать. Я бы сначала показал код.

    public class HashMapCheck {
    int m_size =10;
    String Keys[], Values[] ;
    void  initKeyValues(int size){
      m_size=size;
      Keys = new String[m_size];
      Values = new String[m_size];
     for(int i=0;i<m_size;i++)
     {
         Keys[i]="key"+i;
         Values[i] ="value"+ i;
     }

    }
    public void  withOutInitialCapacity(){
    long start= System.nanoTime();
    HashMap hm = new HashMap();
    long hmEnd=System.nanoTime();
    long hmPutStart=hmEnd;
     for(int i=0;i<m_size;i++)
     {
        hm.put(Keys[i], Values[i]);
     }
     long hmPutEnd=System.nanoTime();
     long hmGetStart=hmPutEnd;
     hm.get("key5");
     hm.get("key155");
     hm.get("key195");
     //hm.get("key395");
     long hmGetEnd =System.nanoTime();
     long end= hmGetEnd;
     System.out.println("size="+m_size+",total="+(end-start)+",put="+
     (hmPutEnd-    hmPutStart)+",get="+(hmGetEnd-hmGetStart));

}

}

ГЛАВНЫЙ КЛАСС

    public class Driver {
    public static void main(String[] args) {
    HashMapCheck hmc = new HashMapCheck();
    hmc.initKeyValues(100);
    hmc.withOutInitialCapacity();

    HashMapCheck hmc2 = new HashMapCheck();
    hmc2.initKeyValues(100);
    hmc2.withOutInitialCapacity();

    HashMapCheck hmc3 = new HashMapCheck();
    hmc3.initKeyValues(100);
    hmc3.withOutInitialCapacity();

    HashMapCheck hmc4 = new HashMapCheck();
    hmc4.initKeyValues(100);
    hmc4.withOutInitialCapacity();

    HashMapCheck hmc5 = new HashMapCheck();
    hmc5.initKeyValues(100);
    hmc5.withOutInitialCapacity();

    HashMapCheck hmc6 = new HashMapCheck();
    hmc6.initKeyValues(100);
    hmc6.withOutInitialCapacity();
    }
    }

Хорошо, я измеряю время, затрачиваемое на то, чтобы поместить 100 значений в хэш-карту и получить из них 3 значения. Теперь возникает вопрос.

1) Сначала я попытался использовать вышеуказанную функцию, где 1 значение (key5) находится в hashMap, а 2 значения (key155, key195) не существуют в hashmap. Ниже приведен результат size=100, total=80446, put=69190,get=6290 size=100,total=69852,put=63893,get=2317 size=100, total=69852,put=62900,get=3972 size = 100, всего = 68859, поставить = 64224, получить = 1656, размер = 100, всего = 69190, положить = 63562, получить = 1655, размер = 100, всего = 67866, положить = 63562, получить = 1324, как вы можете видеть получить ( ) время в 3-м и первом больше, чем во всех остальных, и сумма также высока для первого

2) На этот раз я попытался внести небольшие изменения в функцию WithoutInitialCapacity(). На этот раз я использую hm.get("key5"); хм.получить("key45"); хм.получить("key195"); Таким образом, в hashMap доступны два значения, а одно — нет. Результат

size=100,total=80777,put=68859,get=6952 size=100,total=73825,put=63893,get=5959
size=100,total=82763,put=78459,get=1324 size=100,total=70845,put=66210,get=1656
size=100,total=70845,put=64886,get=1655 size=100,total=69190,put=64886,get=1324
1st and second get has a high value. 

Почему это происходит? Это JIT?


person Philip George    schedule 23.07.2014    source источник
comment
Пожалуйста, прочитайте Как мне написать правильный микротест на Java?   -  person reto    schedule 23.07.2014
comment
Извините, рето, мне было трудно обойти ошибку stackoverflows «это содержит код, пожалуйста, сделайте отступ». пожалуйста, прочитайте вопрос еще раз. Спасибо за ответы.   -  person Philip George    schedule 23.07.2014
comment
Спасибо за добавление дополнительных деталей, форматирование кода и т. д. Но на самом деле я имел в виду, что вы должны пойти и прочитать основные ответы в связанном вопросе, дополнительно улучшить свои тесты на основе ответов и посмотреть, сохраняется ли ваш первоначальный вопрос.   -  person reto    schedule 23.07.2014