使用byte []键和驱逐策略构建C#缓存

时间:2012-05-21 21:29:27

标签: c# .net

我想在C#中使用逐出策略构建缓存。我的密钥是一个字节数组(固定为32字节),value是特定类的实例。

我在辩论最好的方法。我认为MemoryCache是要走的路,但它使用string作为密钥。我可以把它变成一个十六进制字符串但是会产生一些开销。为什么键不是字典中的任意对象?

编写一个字节数组比较器并且有一个合适的Dictionary构造函数来提供IEqualityComparer是微不足道的,但这种方法并没有给我一个免费的驱逐策略。

我还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

MemoryCache实际上相当复杂(抓住Reflector的副本并查看你是否还没有)。它有几件事情是非常重要的复制品;其中最主要的是近似缓存对象使用的内存大小。

在性能方面,与按键的按摩相比,您将会遇到更多更重要的影响。绩效是可以接受的,但关键管理是这个过程中不重要的一部分。

您可以通过DictionaryMemoryCache执行100K +添加操作来了解这种差异。

这是一个小的十六进制算法,你可以在你的字节键上使用,我已经调整到尽可能快。 BCL还包含16位基本功能(当我编写这段代码时我不知道,因为它更简单/更快,所以我保留了它。)

正如评论中所述,将byte[]转换为十六进制可能甚至不需要满足规定的要求,除非密钥将在其他地方使用。

public unsafe sealed class Hex
{
    private static readonly char[] _hexRange = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    /// <summary>
    /// Converts a byte array into a string of base-16 values.
    /// </summary>
    /// <param name="value">Value to convert.</param>
    /// <returns>Base-16 encoded string.</returns>
    public static string ToHexString( byte[] value )
    {
        char* buffer = stackalloc char[( value.Length * 2 ) + 1]; // +1 for null terminator
        char* start = buffer;

        for( int i = 0; i < value.Length; i++ )
        {
            *buffer++ = _hexRange[value[i] / 16];
            *buffer++ = _hexRange[value[i] % 16];
        }

        return new string( start );
    }
}

答案 1 :(得分:1)

嗯,一个解决方案就是在网上寻找一个图书馆。像LRU列表一样。

另一方面,MemoryCache经过充分测试和精心设计。它可能很快。如果计算字符串密钥的性能开销是可以接受的,我只需要使用该解决方案。我的猜测是计算密钥的开销远远低于执行缓存操作,但这是猜测(需要测量)。