Подходы для кэширования расчетных значений

Можно пропустить цикл с условием продолжения и использование

DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );

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

8
задан Tihauan 8 October 2009 в 08:14
поделиться

3 ответа

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

Код такого атрибута написан на Delphi как процедура или на OCL (язык объектных ограничений) в модели. Если вы пишете его как код Delphi, вы должны подписаться на зависимые переменные. Итак, если атрибут C зависит от A и B, то всякий раз, когда A или B изменяют код для повторного вычисления C, вызывается автоматически при чтении C. Итак, при первом чтении C читается A и B (возможно, из базы данных). Пока A и B не изменены, вы можете читать C и получить очень высокую производительность. Для сложных вычислений это может сэкономить довольно много процессорного времени.

Обратной стороной и плохой новостью является то, что Bold официально больше не поддерживается, и вы также не можете его купить. Я полагаю, вы сможете получить, если спросите достаточно людей, но я не знаю, где это можно скачать. Примерно в 2005–2006 годах его можно было бесплатно загрузить с Borland, но больше нет. Он не готов к D2009, так как кто-то должен перенести его на Unicode.

Другой вариант - ECO с dot.net из Capable Objects . ECO - это плагин в Visual Studio. Это поддерживаемый фреймворк, у которого та же идея и автор, что и Bold для Delphi. Многие вещи также улучшены, например, для GUI-компонентов используется привязка данных. И Bold, и ECO используют модель в качестве центральной точки с классами, атрибутами и ссылками. Их можно сохранить в базе данных или в xml-файле. В бесплатной версии ECO модель может иметь максимум 12 классов, но, насколько я помню, других ограничений нет.

Полужирный шрифт и ECO содержат гораздо больше, чем производные атрибуты, что делает вас более продуктивным и позволяет думать о проблеме, а не о технических деталях базы данных или, в вашем случае, о том, как кэшировать значения. На самом деле есть ссылка для загрузки для зарегистрированных пользователей Embarcadero для Полужирный шрифт для Delphi для D7, довольно старый ... Я знаю, что были обновления для D2005, объявление D2006.

1
ответ дан 5 December 2019 в 21:20
поделиться

Если вы хотите избежать использования шаблона наблюдателя, вы можете попробовать использовать подход хеширования.

Идея состоит в том, что вы «хешируете» аргументы и проверяете, соответствуют ли они «хешу», для которого сохраняется состояние. Если этого не происходит, то вы пересчитываете (и таким образом сохраняете новый хэш как ключ).

Я знаю, что звучит так, будто я только что подумал об этом, но на самом деле он используется хорошо известными программами.

Например,

4
ответ дан 5 December 2019 в 21:20
поделиться

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

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

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

unit Unit1;

interface

type
  TMyObject = class
  private
    FObject1, FObject2: TMyOtherObject;
    FObject1Val, FObject2Val: Integer;
    FMyCalculatedValue: Integer;
      function GetMyCalculatedValue: Integer;
  public
    property MyCalculatedValue: Integer read GetMyCalculatedValue;
  end;

implementation

  function TMyObject.GetMyCalculatedValue: Integer;
  begin
    if (FObject1.OtherCalculatedValue <> FObjectVal1)
    or (FObject2.OtherValue <> FObjectVal2) then
    begin
      FMyCalculatedValue :=
        FObject1.OtherCalculatedValue + // This is also calculated
        FObject2.OtherValue;
      FObjectVal1 := FObject1.OtherCalculatedValue;
      FObjectVal2 := Object2.OtherValue;
    end;

    Result := FMyCalculatedValue;
  end;

end.
2
ответ дан 5 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

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