gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:23:57 25 4
gpt4 key购买 nike

我想用 C# 中的逐出策略构建缓存。我的键是字节数组(固定为 32 字节),值是特定类的实例。

我正在讨论执行此操作的最佳方法。我认为 MemoryCache 是可行的方法,但它使用 string 作为键。我可以将其转换为十六进制字符串,但这会产生一些开销。为什么键不是像字典中那样的任意对象?

编写字节数组比较器很简单,并且有一个合适的 Dictionary 构造函数来提供 IEqualityComparer,但这种方法并没有免费提供驱逐策略。

还有我忽略的其他选项吗?

最佳答案

MemoryCache 实际上在幕后相当复杂(拿一份 Reflector 看看,如果您还没有看的话)。它所做的几件事是非常重要的;其中最主要的是近似缓存对象使用的内存大小。

在性能方面,您将应对比按键按摩更重要的影响。性能是可以接受的,但 key 管理是该过程的一个微不足道的部分。

通过在 DictionaryMemoryCache 上执行 100K+ 添加操作,您可以看到这种差异。

这里有一个小的十六进制算法,你可以用在你的字节键上,我已经调整得尽可能快。 BCL 还包含 base 16 功能(我在编写这段代码时并不知道它,但我一直保留着它,因为它更简单/更快)。

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

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 );
}
}

关于c# - 使用 byte[] 键和逐出策略构建 C# 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com