我想在C#中使用逐出策略构建缓存。我的密钥是一个字节数组(固定为32字节),value是特定类的实例。
我在辩论最好的方法。我认为MemoryCache
是要走的路,但它使用string
作为密钥。我可以把它变成一个十六进制字符串但是会产生一些开销。为什么键不是字典中的任意对象?
编写一个字节数组比较器并且有一个合适的Dictionary
构造函数来提供IEqualityComparer
是微不足道的,但这种方法并没有给我一个免费的驱逐策略。
我还有其他选择吗?
答案 0 :(得分:3)
MemoryCache
实际上相当复杂(抓住Reflector的副本并查看你是否还没有)。它有几件事情是非常重要的复制品;其中最主要的是近似缓存对象使用的内存大小。
在性能方面,与按键的按摩相比,您将会遇到更多更重要的影响。绩效是可以接受的,但关键管理是这个过程中不重要的一部分。
您可以通过Dictionary
与MemoryCache
执行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经过充分测试和精心设计。它可能很快。如果计算字符串密钥的性能开销是可以接受的,我只需要使用该解决方案。我的猜测是计算密钥的开销远远低于执行缓存操作,但这是猜测(需要测量)。