Стоит ли кэшировать объекты, созданные Delphi's Memory Manager? - PullRequest
9 голосов
/ 03 ноября 2008

У меня есть приложение, которое создает и уничтожает тысячи объектов. Стоит ли кэшировать и повторно использовать объекты, или менеджер памяти Delphi достаточно быстр, чтобы многократно создавать и уничтожать объекты не так уж много затрат (в отличие от отслеживания кэша)? Когда я говорю, что стоит, конечно, я смотрю для повышения производительности.

Ответы [ 7 ]

17 голосов
/ 03 ноября 2008

Из недавнего тестирования - если создание объекта стоит недорого (т.е. не зависит от внешних ресурсов - доступа к файлам, реестру, базе данных ...), тогда вам будет непросто обыграть менеджер памяти Delphi. Это так быстро.

Это, конечно, верно, если вы используете последнюю версию Delphi - если нет, возьмите FastMM4 из SourceForge и используйте его вместо внутренней ММ Delphi.

15 голосов
/ 03 ноября 2008

Выделение памяти - это лишь малая часть того, почему вы хотите кэшировать. Вам необходимо знать полную стоимость создания семантически правильного объекта и сравнивать его со стоимостью извлечения элементов из кэша, а не только для микропроцессора: эффекты кэша (то есть кэш-память ЦП) могут изменить динамику времени выполнения в реальном запущенном приложении.

Или, другими словами, измерить и выяснить. Если вы не измеряете, вы не инженер, просто догадываетесь.

6 голосов
/ 03 ноября 2008

Только профайлер скажет вам. Попробуйте оба подхода в узком цикле и посмотрите, что получится сверху: -)

3 голосов
/ 03 ноября 2008

Чтобы ответить на подобные вопросы, вам абсолютно необходимо измерить нагрузку в реальном мире. В зависимости от того, какие ресурсы хранятся в этих объектах, конфликт ресурсов, стоимость строительства, размер и т. Д., Ответ может вас удивить и даже может измениться в зависимости от характера нагрузки.

Обычно очень трудно определить, где будут проблемы с производительностью, без измерения.

1 голос
/ 03 ноября 2008

Я думаю, это зависит от кода, который ваши объекты будут выполнять во время создания и уничтожения. Воздействие от TObject.Create и TObject.Destroy, как правило, пренебрежимо мало и может легко перевесить кэширование.

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

0 голосов
/ 03 ноября 2008

Вам также понадобятся некоторые статистические данные о том, как часто используется конкретный объект (экземпляр). Если вы регулярно ссылаетесь на один и тот же набор данных, то кэширование может реально улучшить производительность, но если доступ распределяется по всем возможным объектам, то вероятность промахов в вашем кэше может быть слишком высокой, чтобы она того стоила.

0 голосов
/ 03 ноября 2008

Часто единственный способ сказать - это попробовать.

Если текущая производительность достаточна, то вам не нужно много звонить, чтобы попытаться увеличить ее. Однако, если у вас есть проблемы с производительностью, может помочь некоторое кэширование (или даже некоторые другие стратегии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...