gpt4 book ai didi

c# - 有限制的 ConcurrentDictionary

转载 作者:太空狗 更新时间:2023-10-29 23:49:21 25 4
gpt4 key购买 nike

我正在编写一些使用反射的代码。所以我试图将昂贵的反射处理缓存到 ConcurrentDictionary 中。但是,我想对并发字典应用限制,以防止存储旧的和未使用的缓存值。

我做了一些研究以了解如何限制 ConcurrentDictionary 的大小。我找到了一些有趣的答案,但是我不知道这些答案是否符合我的要求并且会表现良好。

我在 Dapper 中找到源代码,他们做了一些自定义代码来处理 ConcurrentDictionary 的限制。他们有一个与 Interlocked 一起使用的收集限制常量能够处理字典的并发。

另一方面,我找到了一个 answer在 SO 上,它使用普通字典,然后在其上应用 ReaderWriterLockSlim 来处理并发。不知道在.Net源码中是不是一样的实现。

我应该使用小巧的实现还是 SO 答案实现?

最佳答案

为了性能,根本不应该使用锁定。此外,请注意 ConcurrentDictionary 类中隐藏的性能瓶颈,例如枚举集合时会产生垃圾(请参阅问题 here)。

使用ThreadStatic

反射缓存唯一明智的解决方案是为每个线程设置一个单独的字典。是的,这会占用一些 RAM,但性能会更好。

public static class TypeExtensions
{
[ThreadStatic] private static Dictionary<Type, PropertyInfo> propertyInfoLookup;

private static Dictionary<Type, PropertyInfo> MemberInfoLookup =>
propertyInfoLookup ??= new Dictionary<Type, PropertyInfo>();

// Sample API
public static PropertyInfo GetPropertyInfo(this Type type) => MemberInfoLookup[type];
}

关于c# - 有限制的 ConcurrentDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49303884/

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