2016-07-10 3 views
0

Мне любопытно, сколько циклов цикла или времени требуется для создания объекта класса, который не имеет поля в java? Я обсуждал это с коллегой, было бы хорошей идеей создать новый объект для уникального способа отыскать что-то или создать uuid, в его защиту он сказал, что создание объекта в java сейчас очень легкое, и я тоже согласен.Сколько циклов cpu создает объект в java?

Но вопрос в том, как он может сравниться с чем-то совершенно другим, например, с образованием uuid?

Следовательно, сомнение в том, сколько циклов процессора требуется, чтобы выделить объект &, что такое точные шаги?

+0

Требуется менее 10 нс. UUID занимает гораздо больше времени. –

+0

Большинство учетных записей о стоимости создания объекта не покрывают стоимость сбора мусора для последующего восстановления хранилища или расширения размера полученного объема памяти, чтобы сделать сборку мусора возможным, что может или не может фигурировать в общем ресурсе потребление, на которое вы фактически взимается или заботится. Но в любом случае большинство подпрограмм UUID в конечном итоге создадут объект для возврата к вам, удерживая UUID в любом случае, поэтому решение UUID может быть не дешевле, независимо от того, какая стоимость создания объекта. – mcdowella

+0

@PeterLawrey, спасибо за время; но хотелось бы понять, сколько шагов требуется. И это произойдет для миллионов запросов в секунду. – Shashank

ответ

7

Создание объекта на Java может занимать от нуля до миллиардных циклов.

  • Ноля: когда объект не ускользает локальную области видимости, JIT компилятор может заменить распределение с локальными переменными в результате оптимизации элиминации распределения.
  • Миллиарды, потому что любое распределение может вызвать (потенциально долго) сбор мусора.

Я уже дал обзор высокого уровня распределения в HotSpot JVM в this и this ответ.

Наиболее распространенным способом выделить объект в TLAB включает в себя следующие этапы:

  1. Load tlab_top указатель (обычно имеется специальный регистр процессора для резьбы на местных x64).
  2. Увеличьте его на размер объекта.
  3. Сравнить tlab_top + object_size против tlab_end. При необходимости перейдите к медленному пути.
  4. Сохраните новое значение tlab_top. Предыдущее значение - это адрес вновь созданного объекта.
  5. Установите заголовок по умолчанию для объекта.
  6. Установите поле klass - указатель на метаданные класса объекта.
  7. Инициализировать данные остального объекта нулями. Даже объект без полей может иметь выравнивание.

Все это около 10-15 инструкций CPU.

Измеряем среднее время создания объекта с помощью теста JMH.

package bench; 

import org.openjdk.jmh.annotations.Benchmark; 

public class Alloc { 

    @Benchmark 
    public Object baseline() { 
     return "Some preallocated object"; 
    } 

    @Benchmark 
    public Object newObject() { 
     return new Object(); 
    } 
} 

Результаты:

Benchmark  Mode Cnt Score Error Units 
Alloc.baseline avgt 10 3,428 ± 0,089 ns/op 
Alloc.newObject avgt 10 4,505 ± 0,056 ns/op 

Таким образом, выделение объекта наряду с бенчмаркинга накладных расходов занимает ~ 4,5 нс или около 11 циклов на 2,4 ГГц процессоре. Это действительно дешево по сравнению с алгоритмами генерации UUID.

Смежные вопросы