Почему первый вызов конструктора занимает в 10 раз больше времени, чем другие?

class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
      new testx();
      new testx();
      new testx();
  }
}

Я всегда получаю результаты, похожие на это 7806 660 517, Почему первый звонок занимает в 10 раз больше времени, чем другие?

2 ответа

Решение

Потому что JVM загружает кучу классов в первый раз в этой точке. Как только это первое System.nanoTime() возвращается, вы уже загрузили System.class а также testx.class, но однажды System.out.println Я подозреваю, что многие классы ввода / вывода загружаются, и это занимает некоторое время.

В любом случае, это не очень хорошая методика бенчмаркинга; вам действительно нужно прогреть JIT, запустив что-то за ~10000 итераций, прежде чем начинать его измерять. В качестве альтернативы (и предпочтительно) используйте предварительно созданный инструмент для тестирования производительности, такой как Caliper.

Это, безусловно, как Луи Вассерман, занимает больше времени в первом раунде, так как он должен загрузить все необходимое System классы, вы можете обойти это, вызвав пробел println() перед созданием новых экземпляров класса, потому что посмотрите, что происходит, когда мы делаем это:

public class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
    //loads all System.* classes before calling constructor to decrease time it takes
    System.out.println();
      new testx();
      new testx();
      new testx();
  }
}

выход:

405 0 405

где в качестве исходного кода выводится:

7293 0 405

Другие вопросы по тегам