Если вы хотите простой ответ, значит, простого ответа нет. Никакое количество называть ответы (и, как следствие, людей) «ленивыми» не поможет.
Как быстро следует ожидать выделения памяти (МБ / с) на стандартном современном ЦП?
На скорости, с которой JVM может обнулять память, предполагая, что выделение не вызывает сборку мусора. Если он запускает сборку мусора, невозможно предсказать, не зная, какой алгоритм GC используется, размер кучи и другие параметры, а также анализ рабочего набора приложений, не являющихся объектами мусора, в течение всего жизненного цикла приложения.
Как размер распределения влияет на скорость распределения?
См. Выше.
Какова точка безубыточности для количества / размера распределений по сравнению с повторным использованием в пуле?
Если вы хотите простой ответ, значит, простого ответа не существует.
Золотое правило гласит: чем больше ваша куча (вплоть до объема доступной физической памяти), тем меньше амортизируемая стоимость сбора мусора. При быстром копировании сборщика мусора амортизированная стоимость освобождения мусорного объекта приближается к нулю, когда куча увеличивается. Стоимость GC фактически определяется (в упрощенном виде) количеством и размером объектов без мусора, с которыми GC имеет дело.
В предположении, что ваша куча велика, стоимость жизненного цикла выделения и GC'а большого объекта (в одном цикле GC) приближается к стоимости обнуления памяти при выделении объекта.
EDIT : Если вам нужны только простые числа, напишите простое приложение, которое распределяет и отбрасывает большие буферы, и запускайте его на своем компьютере с различными параметрами GC и кучи и смотрите, что происходит. Но имейте в виду, что это не даст вам реалистичного ответа, потому что реальные затраты на сборку мусора зависят от объектов, не являющихся мусором приложения.
Я не собираюсь писать для вас тест, потому что Я знаю , что он даст вам поддельные ответы.
РЕДАКТИРОВАТЬ 2 : в ответ на комментарии ОП.
Итак, я должен ожидать, что распределение будет выполняться так же быстро, как System.arraycopy или цикл инициализации массива JITed (около 1 ГБ / с на моем последнем тесте, но я сомневаюсь в результате)?
Теоретически да. На практике это трудно измерить таким образом, чтобы отделить затраты на распределение от затрат на сборщик мусора.
По размеру кучи, вы говорите, что выделение большего объема памяти для использования JVM фактически снизит производительность?
Нет, я говорю, что это может увеличить производительность. Значительно. (При условии, что вы не столкнетесь с эффектами виртуальной памяти на уровне ОС.)
Распределения предназначены только для массивов, и почти все остальное в моем коде выполняется в стеке. Это должно упростить измерение и прогнозирование производительности.
Может быть. Честно говоря, я думаю, что вы не добьетесь большого улучшения за счет утилизации буферов.
Но если вы собираетесь пойти по этому пути, создайте пул буферов interface с двумя реализациями. Первый - это реальный потокобезопасный пул буферов, который перезапускает буферы. Второй - фиктивный пул, который просто выделяет новый буфер каждый раз, когда вызывается alloc
, и обрабатывает dispose
как неработоспособный. Наконец, позвольте разработчику приложения выбирать между реализациями пула с помощью метода setBufferPool
и / или параметров конструктора и / или свойств конфигурации времени выполнения. Приложение также должно иметь возможность предоставлять класс / экземпляр пула буферов своего собственного создания.