【问题标题】:MultiMap implementation多地图实现
【发布时间】:2008-11-23 02:38:32
【问题描述】:

我正在用 C# 编写一个简单的 IDictionary 抽象,它包含一个 字典>。基本上,它将多个值映射到一个键。当值列表中的最后一项被删除时,我无法决定是删除一个键及其空列表,还是保留它(以避免在重用键时实例化新集合)并检查键的值'计数在确定密钥是否存在时。

【问题讨论】:

    标签: .net performance data-structures collections


    【解决方案1】:

    我会删除集合,以便您的 MultiMap 具有一致的行为。如果我使用您的 MultiMap,我会非常惊讶(并且不高兴)发现缺少的键的行为会有所不同,具体取决于键之前是否在 MultiMap 中。

    Clear() 是否删除集合?

    如果您不删除集合,也可能会造成意外的内存泄漏。开发人员可能会添加许多项目,然后将其删除。内存使用量(GC 之后)应该恢复到与添加这些项目之前相同的数量。

    我不会担心创建集合的成本。我会担心您为 MultiMap 创建的合同。如果在分析您的应用程序后您发现这是一个问题,您可以为该行为修改或创建一个特殊的 MultiMap。不要陷入过早优化的陷阱。

    【讨论】:

      【解决方案2】:

      在 .NET 3.5 中,ILookup<TKey,TValue>Lookup<TKey,TValue> 充当多映射。内置实现(Lookup<TKey,TValue>)是不可变的,但我在miscutil 中写了一个EditableLookup<TKey,TValue>

      在那个版本中;是的-如果删除了最后一项(带有该密钥),我将删除该密钥。这样可以更轻松地查看存在哪些键(即.Keys 等)。

      【讨论】:

        【解决方案3】:

        为什么即使所有值都被删除,也不将密钥视为存在,并提供用于删除密钥的显式 API?

        【讨论】:

          【解决方案4】:

          这取决于您的使用模式。如果您要添加和删除大量项目,那么这些空集合将耗尽内存。我的猜测是你不会通过保留收藏来节省那么多时间。与往常一样,如果它对您的表现如此重要,您应该衡量而不是猜测哪种方式更好。

          如果您真的认为创建这些集合很昂贵,那么不要一直创建新集合,而是将未使用的集合放入一个列表中,并在将新键添加到您的 hashmap 时重用它们。我认为这可能是蝇量级模式。您可能应该将未使用的集合列表保持在小于主 hashmap 大小的一半(再次测量该比率如何影响性能)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-16
            • 2020-03-02
            • 2015-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-08
            • 2011-01-25
            相关资源
            最近更新 更多