Действительно ли стоит кэшировать объекты, созданные Диспетчером памяти Delphi?

Использование помощника просто означает, что вы должны разбить вашу программу на более мелкие части и, возможно, инкапсулировать циклы с дополнительными параметрами в отдельных процедурах - и в схемах циклы часто реализуются через рекурсивные вызовы. Одним (наивным) способом реализации процедуры is_prime будет:

(define (is_prime n)
  (cond ((<= n 1) #f)
        ((= n 2) #t)
        ((= (modulo n 2) 0) #f)
        (else (check 3 n))))

; recursive helper
(define (check i n)
  (cond ((> (* i i) n) #t)
        ((= (modulo n i) 0) #f)
        (else (check (+ i 2) n))))

Существует много способов реализации этой процедуры и множество возможных оптимизаций; вышесказанного должно быть достаточно для начала.

9
задан Mitch Wheat 3 November 2008 в 00:45
поделиться

7 ответов

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

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

17
ответ дан 4 December 2019 в 06:14
поделиться

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

6
ответ дан 4 December 2019 в 06:14
поделиться

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

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

15
ответ дан 4 December 2019 в 06:14
поделиться

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

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

3
ответ дан 4 December 2019 в 06:14
поделиться

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

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

1
ответ дан 4 December 2019 в 06:14
поделиться

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

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

0
ответ дан 4 December 2019 в 06:14
поделиться

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

0
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: