我有一个高效的 C# 应用程序,它在多线程 CPU 上以每秒 5k 到 10k 条记录的速率接收 80 字节的数据。
我现在需要在内存缓存中设置一个来检测和过滤重复记录,这样我就可以抑制它们在管道中进一步传播。
缓存规范(最大阈值)
问题
设置内存缓存、字典、哈希表、数组等的最佳方法是什么,以实现最有效的查找、清除旧缓存数据并防止命中的数据过期。
我查看了 ASP.Net Cache 、 System.Runtime.MemoryCache ,但认为我需要更轻量级和定制的东西来实现正确的吞吐量。我也在寻找 System.Collections.Concurrent 作为替代和 this related whitepaper 。
有没有人对最好的方法有什么建议?
最佳答案
记住,不要过早地优化!
可能有一种相当简洁的方式来做到这一点,而无需求助于非托管代码、指针等。
在我的旧的普通笔记本电脑上进行的快速测试表明,您可以将 1,000,000 个条目添加到 HashSet
,同时在大约 100 毫秒内删除 100,000 个条目。然后,您可以在大约 60 毫秒内使用相同的 1,000,000 个值重复该操作。这仅适用于 longs - 80 字节数据结构显然更大,但需要一个简单的基准测试。
我的建议:
HashSet
,这对于插入、删除和查找非常快。 Circular Buffer for .NET
Fast calculation of min, max, and average of incoming numbers
Generic C# RingBuffer
How would you code an efficient Circular Buffer in Java or C#
HashSet
中删除。无需使两个数据结构相同。 上面的设计可以简洁地包装,并尝试以最小的复杂性实现所需的原始性能。这只提供了一个不错的基线,现在可以从中提取和测量效率。
( Note : 如果您需要缓存的持久性,请查看 Kyoto Cabinet 。如果您需要缓存对其他用户可见或已分发,请查看 0x251381124
关于c# - 需要一个高效的内存缓存,每秒可以处理 4k 到 7k 次查找或写入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10564181/