如果只需要读取一次,则在查找后从 C# 字典中删除项目的任何性能优势

Any performance benefits to removing items from C# Dictionary after lookup if they only need to be read once

我有一个以字符串为键的对象字典。该词典首先填充了 50 到数万个条目。后来我的程序在这个字典中查找值,在字典中找到一个项目后,我不再需要保留我刚刚在字典中找到的对象。那么我的问题是,如果我从字典中删除不再使用的条目,我是否能够获得更好的总执行时间,可能会减少内存使用或只是使后续查找稍微快一些,或者会花费额外的时间删除项目更有影响力?

我知道这个问题的答案可能取决于某些细节,例如对字典进行的总查找次数、键的大小和对象的大小,我将尝试在下面提供这些,但是对此有一般性答案吗?是否没有必要尝试以这种方式提高性能,或者在某些情况下这是个好主意?

密钥是可变长度的字符串,6 个字符或 ~20 个字符。 总查找完全悬而未决,我可能只需要检查 50 次左右,或者我可能需要完全独立于字典的大小查找 10K 次,即字典可能有 50 个项目,我可能会进行 10K 次查找,或者我可能有 10K 项并且只进行 50 次查找。

另外要注意的是,如果我确实从字典中删除了项目并且留下了一个空字典,那么我可以向等待线程发出信号,在我处理剩余项目时不再等待我(涉及解析通过一个长文本文件,同时在字典中查找项目以确定如何处理已解析的数据)。

字典查找本质上是 O(1)。从字典中删除项目会对查找速度产生微小的(如果有的话)影响。

最后,删除项目很可能比将它们留在里面要慢。

我建议删除项目的唯一原因是您需要减少内存占用。

我在 DotNetPerls 上发现了一些有趣的项目,它们似乎与您的问题有关。

The order you add keys to a Dictionary is important. It affects the performance of accessing those keys. Because the Dictionary uses a chaining algorithm, the keys that were added last are often faster to locate.

http://www.dotnetperls.com/dictionary-order

Dictionary size influences lookup performance. Smaller Dictionaries are faster than larger Dictionaries. This is true when they are tested for keys that always exist in both. Reducing Dictionary size could help improve performance.

http://www.dotnetperls.com/dictionary-size

我觉得这最后的花絮真的很有趣。我没想到要考虑我的密钥长度。

Generally, shorter [key] strings perform better than longer ones.

http://www.dotnetperls.com/dictionary-string-key

问得好!