В настоящее время я пытаюсь создать некоторую оптимизацию выполнения кода для конкурса и рассматривал шаблон ObjectPool, чтобы способствовать повторному использованию объекта вместо создания экземпляра нового объекта.
Я собрал небольшой проект (и только тестовый класс), чтобы исследовать некоторые вещи, которые я вижу и не понимаю. .
Что я делаю:
- сравните создание очень простых объектов за 5 000 000 итераций с использованием операций new() и Pool.get()
- play around three axes, running all tests with and without:
- a "warmup" that runs the loop once before doing the measurements
- назначение вновь созданного объекта локальной переменной и использование ее для некоторых вычислений
- использование фиксированных и случайных параметров в качестве аргументов
У меня есть следующие результаты:
Figures are for new instantiation vs with object pool for 5 000 000 iterations
without_warmup_without_new_object_use_with_random_parameters: 417 vs 457
without_warmup_without_new_object_use_with_fixed_parameters: 11 vs 84
without_warmup_with_new_object_use_with_random_parameters: 515 vs 493
without_warmup_with_new_object_use_with_fixed_parameters: 64 vs 90
with_warmup_without_new_object_use_with_random_parameters: 284 vs 419
with_warmup_without_new_object_use_with_fixed_parameters: 8 vs 55
with_warmup_with_new_object_use_with_random_parameters: 410 vs 397
with_warmup_with_new_object_use_with_fixed_parameters: 69 vs 82
Что я из этого замечаю:
- Использование фиксированных параметров имеет огромное значение при создании экземпляра нового объекта без его повторного использования. Я предполагаю, что компилятор выполнял какую-то оптимизацию и обнаружил, что побочных эффектов нет, и он полностью удалит создание экземпляра объекта, но сравнение производительности с пустым циклом показывает, что что-то все еще происходит.
- Использование фиксированных параметров оказывает значительное влияние (хотя и менее выраженное) на скорость new Object(), делая его быстрее, чем версия пула объектов в некоторых случаях.
- Пул объектов работает быстрее в "реальных" сценариях (т.е. повторное использование новых объектов и несколько случайных параметров), но не в большинстве из них, что также указывает на оптимизацию компилятора.
Я ищу здесь, чтобы понять эти результаты и получить указатели на документы/книги, которые я мог бы прочитать, чтобы получить хорошее представление о том, что происходит за кулисами в этих случаях.
Спасибо!
random.nextDouble()
, а не к любой оптимизации компилятора/JIT, которую вы предполагаете. - person Mike Nakis   schedule 28.01.2017fill it up and you start reusing objects previously allocated
Не уверен, что понял, что вы имеете в виду. Насколько я вижу, пул заполнен и повторно использует предметы. Что касается освобождения объектов, я хочу рассмотреть это позже. Мой вариант использования довольно прост, поэтому флага на объекте (или клонирования нескольких объектов, которые я хочу сохранить) может быть достаточно. - person Sébastien Tromp   schedule 28.01.2017new
. - person Mike Nakis   schedule 28.01.2017Once you add the concept of freeing, things will become a lot more complicated
: понял. В данном конкретном случае объекты создаются для короткой обработки и впоследствии могут быть повторно использованы, поэтому нужно ли их явно освобождать? - person Sébastien Tromp   schedule 28.01.2017