c# - 扩展方法的缓存结果

标签 c# caching optimization extension-methods

我对缓存/存储对任意对象执行的扩展方法的结果的方法感兴趣。

目的是避免冗余的昂贵操作。以这个扩展方法为例,将一个整数转换为包含其数字的整数数组。请忽略对方法本身的潜在优化……这与我无关。

    public static int[] Digits(this int i)
    {
        List<int> n = new List<int>();

        for (; i > 0; i /= 10)
            n.Add(i % 10);

        n.Reverse();
        return n.ToArray();
    }

如果在同一个对象上两次调用该方法,则它必须执行两次。我的第一种方法是缓存结果并检查对象是否相等:

static class Extensions
{
    public static int[] Digits(this int i)
    {
        int[] cache;
        if (ExtensionCache.IsIntegerDigitized(i, out cache))
            return cache;

        List<int> n = new List<int>();

        for (; i > 0; i /= 10)
            n.Add(i % 10);

        n.Reverse();

        ExtensionCache.CacheIntegerDigitization(i, n.ToArray());

        return n.ToArray();
    }
}

static class ExtensionCache
{
    static Dictionary<int, int[]> _digitizedIntegerCache;
    public static Dictionary<int, int[]> DigitizedIntegerCache
    {
        get { return _digitizedIntegerCache ?? (_digitizedIntegerCache = new Dictionary<int, int[]>()); }
    }

    static public bool IsIntegerDigitized(int i, out int[] digits)
    {
        if (DigitizedIntegerCache.ContainsKey(i))
        {
            digits = DigitizedIntegerCache[i];
            return true;
        }
        else
        {
            digits = null;
            return false;
        }
    }

    static public void CacheIntegerDigitization(int i, int[] digits)
    {

        if (DigitizedIntegerCache.ContainsKey(i))
            return; 

        DigitizedIntegerCache.Add(i, digits);
    }
}

我在这里预见的最大问题是缓存结果和未经检查的内存消耗的不断增长的字典。我不想在超出范围的对象上保留结果缓存。

我在这个例子中使用了 int,一种值类型,但我对涵盖引用和值类型的解决方案感兴趣。

最佳答案

与其编写自己的缓存类,不如考虑使用 MemoryCache .它能够根据绝对或滑动时间窗口限制内存使用或删除缓存的项目。

关于c# - 扩展方法的缓存结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192248/

相关文章:

C# 安全登录

c# - CheckBoxList 子级 CSS

c# - .Net Core 3 Serilog 的依赖注入(inject)

java - 查询缓存区域是否必须与实体缓存区域相同

java - 如何使这个 "cleaner"

c# - 计时 ASP.NET 页面加载

c# - 数据库、请求、性能、缓存

python - 带有默认可选参数的内存/缓存

计算快速对数基数 2 上限

c - 快速双向位移?