Измерение времени для создания и уничтожения простого объекта - PullRequest
1 голос
/ 03 апреля 2010

Из эффективной Java 2-й редакции, пункт 7: Избегайте финализаторов

"О, и еще одна вещь: существует серьезное снижение производительности при использовании финализаторов. На моей машине время создания и уничтожения простого объекта составляет около 5,6 нс. Добавление финализатора увеличивает время до 2400 нс. другими словами, создание и уничтожение объектов с помощью финализаторов примерно в 430 раз медленнее. "

Как измерить время создания и уничтожения объекта? Вы просто делаете:

long start = System.nanoTime();
SimpleObject simpleObj = new SimpleObject();
simpleObj.finalize();
long end = System.nanoTime();
long time = end - start;

Ответы [ 3 ]

2 голосов
/ 03 апреля 2010

Это только измеряет время выполнения метода finalize. Подавляющее большинство затрат на доработку будет заключаться в особой обработке, которую должен выполнить GC.

1 голос
/ 03 апреля 2010

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

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

Я думаю, это то, что сделал Джошуа Блох в этом случае, но моя копия наверху, и я чувствую себя ленивым.

0 голосов
/ 03 апреля 2010

Вы можете запросить среду выполнения, чтобы выполнить сборку мусора через Runtime.gc(), но сборщик мусора не обязан выполнять это прямо здесь:

  • Метод finalize() вызывается не вами, а сборщиком мусора
  • Вы можете просто установить simpleObj на null, а затем вызвать сборку мусора для достижения более реалистичного сценария
...