C# 在静态调用之间缓存值

本文关键字:缓存 之间 调用 静态 | 更新日期: 2023-09-27 17:56:17

我有一个抽象类,它在几个嵌套循环中运行一系列计算密集型静态函数。

在少数这些循环中,我需要获取存储在 .settings 文件中以逗号分隔字符串存储的日期列表。然后,我将它们解析为日期时间并使用它们。

问题是,我一遍又一遍地重新解析这些字符串,这显然占用了相当多的 CPU 时间。分析显示,20% 的核心算法浪费在这些操作上。如果我能以某种方式将它们缓存在静态函数可访问的位置,那么它将为我节省大量处理时间。

最简单的选择是在计算开始时解析 DateTimes 列表,然后将该列表传递给每个子函数。这肯定会减少 CPU 工作,但这意味着子函数在核心算法之外调用时需要接受此列表。为什么在调用父静态函数之一时需要 DateTimes 列表,这并不直观。

修复它的另一件事是使类不抽象,函数非静态,并将日期列表等存储在变量中,供每个函数访问。我想用静态函数抽象它的原因是因为我不想每次我想手动调用其中一个子函数时都必须实例化类。

理想情况下,我想做的是解析列表一次并将其存储在内存中的某个位置。然后,当我进行后续迭代时,我可以以某种方式检查它是否不为 null,然后我可以使用它。如果它是空的(可能是因为我处于第一次迭代中),那么我知道我需要解析它。

我想我可以有一个包含列表的 .settings 文件。我永远不会将设置文件保存到磁盘,但它基本上允许在静态调用之间进行存储。

我知道这一切都非常混乱 - 如果可行,我只是试图避免重写一千行静态代码。

如果你们都认为这是一个糟糕的主意,那么我会举起我的白旗并重写这一切。

C# 在静态调用之间缓存值

如果日期是只读的,那么它非常简单 - 在一个类上声明一个静态属性,如果它们不存在,则加载值并将它们存储在静态变量中 - 如下所示:

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

如果日期不是只读的,请小心 - 那么您必须更详细地考虑事情。

修复它的另一件事是使类不抽象,函数非静态,并将日期列表等存储在变量中,供每个函数访问。我想用静态函数抽象它的原因是因为我不想每次我想手动调用其中一个子函数时都必须实例化类。

这样做。类的存在是为了封装状态。如果将缓存存储在静态位置,则只有在要添加并行性或重构代码时才会给自己带来麻烦。

我不确定你所说的第二部分("手动调用")是什么意思。你的意思是在测试时吗?