C # Кэширование значений между статическими вызовами - PullRequest
0 голосов
/ 12 мая 2011

У меня есть абстрактный класс, который выполняет довольно вычислительные серии статических функций внутри нескольких вложенных циклов.

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

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

Самый простой вариант - это проанализировать список DateTimes в самом начале вычисления, изатем передайте этот список каждой из подфункций.Это, безусловно, сократит работу ЦП, но это будет означать, что подфункции должны будут принимать этот список при вызове вне основного алгоритма.Интуитивно не понятно, зачем нужен список DateTimes при вызове одной из родительских статических функций.

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

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

Я думал, что мог бы иметь файл .settings, в котором есть список.Я бы никогда не сохранил файл настроек на диск, но в основном это позволило бы хранить между статическими вызовами.

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

Если вы все думаете, что это ужасная идея, тогда я подниму свой белый флаг и перепишу все это.

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Если даты доступны только для чтения, то это довольно просто - объявить статическое свойство для класса, который загружает значения, если они не существуют, и сохраняет их в статической переменной - что-то вроде этого:

public class DateList
{
  private static List<DateTime> mydates = null;  // new List<DateTime>();  haha, oops

  public static List<DateTime> Current {
    get {
      if(mydates == null)
      {
        lock(typeof(DateList)) {
          if(mydates == null) {
            mydates = LoadDates();
          }
        }
      }
      return mydates;
    }
  }

  // thanks to Porges - if you're using .NET 4 then this is cleaner and achieves the same result:
  private static Lazy<List<DateTime>> mydates2 = new Lazy<List<DateTime>>(() => LoadDates(), true);
  public static List<DateTime> Current2
  {
     return mydates2.Value;
  }

}

тогда к этому примеру можно получить доступ с помощью:

var dates = DateList.Current

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

2 голосов
/ 12 мая 2011

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

Сделайте это.Классы существуют для того, чтобы инкапсулировать состояние.Если вы храните кеш где-нибудь в статическом состоянии, вы будете создавать себе проблемы только в том случае, если / когда вы захотите добавить параллелизм или рефакторинг кода.

Я не уверен, что вы подразумеваете под второй частью ("вручнуювызов").Вы имеете в виду во время тестирования?

...