.net字典与其他托管自定义数据结构,为什么.net字典如此之快?

Inu*_*a G 8 c# tree dictionary

我正在开发一个自定义持久键值类型数据结构,以与SqlLite和Berkley DB进行比较.无论如何,在我编写实现之前,我想找到用于此目的的最佳数据结构.我看着一对夫妇:

  • 一个开源的redblack树.
  • 单声道字典实现.

我希望我选择的数据结构的性能数字与.net字典相当.

我使用了一个简单的测试循环,对插入进行了500k次迭代,并使用秒表测量插入和键查找:

我注意到了

  • Berkley DB密钥查找时间与Dictionary大致相同.
  • 我尝试了我的for循环测试C5字典,redblack树实现甚至mono的字典实现.

插入时间:比.net字典慢7%.
查找时间:比.net字典慢1000%.这比使用sqllite的查找速度还要慢!我尝试在打开编译器优化的情况下执行测试,但仍然得到了类似的结果.

我意识到我正在比较Hashtables和树等,但我难以理解所有数据结构之间的性能差异.

任何人都有任何想法

LBu*_*kin 4

两个想法:

  1. 您应该确保您的测试中没有无意中包含 JIT 时间 - 这可能会给结果增加相当多的时间。您应该在同一次执行中执行两次运行并放弃第一次运行。

  2. 您应该确保您没有在调试器下运行 - 这可能会极大地影响性能结果。

除此之外,您看到的任何性能差异很可能是哈希表和树之间性能差异的结果。树结构的查找平均性能通常为 O(n*log(n))。平衡树可以将其减少到 O(lon(n))。同时,当避免哈希冲突时,哈希表的查找时间可以接近 O(1)。

我还认为 .NET Dictionary 类是高度优化的,因为它是 .NET 中许多不同事物的基础数据结构。此外,通用 Dictionary<> 可能能够避免装箱,因此您可能会看到一些性能差异。