Mik*_*e Q 8 .net c# indexing dictionary
我有一个Session的概念,它存储各种状态的对象.
有时我需要扫描Session以查找与特定查询匹配的对象,但是我做了很多,性能测试表明它已经成为某些领域的瓶颈.
因此,我想在Session上介绍索引的概念.
就像是...
public IDictionary<K, V> GetIndex<K, V>(Func<V, K> keySelector)
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何像这样测试Func的"相等".显然我希望索引只能在第一次调用GetIndex和后续调用时再构建它.
我应该如何在内部映射这些以进行索引存在查找?
IDictionary<???, IDictionary<K, V>> indexes = ...
Run Code Online (Sandbox Code Playgroud)
基本上我应该如何存储???.也许我不能用Func做到这一点,但也许还有其他方法.
最简单的方法可能是计算查询的哈希值,然后使用哈希值作为键将结果插入到字典中。
如果您的查询是字符串,您可能只需使用 string.GetHashCode 函数来计算字符串数据的简单哈希值。如果您的查询是 Linq 查询,则 .GetHashCode 可能无法工作,除非 Linq 专门重写此方法来计算表达式树而不是默认对象实例指针的哈希值。.GetHashCode 的默认实现只是返回一个从内存中的对象实例标识派生的值,而不考虑对象的数据内容。
如果您的查询是字符串并且在构造上相当统一/一致,则计算简单的字符串哈希应该足以减少使用缓存的查询流量。如果您的查询在结构上不太一致(例如,等效查询但参数顺序不同),您可能需要构建自己的哈希函数,该函数在输入查询的规范化形式上计算哈希,以提高查询的缓存命中率逻辑上相同但文本上不同。
随着哈希计算的计算成本越来越高,它会降低使用缓存的性能增益。确保查询操作足够昂贵,足以证明花时间计算哈希值和消耗缓存内存以产生执行时间的净节省。查询操作应该比哈希计算和缓存管理开销至少大2个或更多数量级。如果您的查询操作是进程外或跨网络调用,那么您的缓存开销几乎肯定与查询成本相形见绌。
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |