【发布时间】:2011-06-08 13:36:30
【问题描述】:
我正在编写一个 Haxe C# 目标,我一直在研究 Haxe 标准库的性能差异,以便我们可以通过其跨平台代码提供最佳性能。
一个很好的例子是哈希表代码。我对使用 .NET 的字典有点不情愿,因为它看起来很笨重(由于内存对齐问题,键/值对的结构会占用大量内存,除了它所持有的不必要信息之外),并且因为在 std库中没有对象哈希之类的东西,我真的认为我可以通过不必调用 GetHashCode 来压缩一点性能,并且一直内联它。
此外,很明显 Dictionary 实现使用链表来处理冲突,这远非理想。
所以我们开始实现我们自己的解决方案,从 IntHash(字典)开始 我们首先实现了Hopscotch hashing,但结果确实不是很好,但很明显它不能很好地支持巨大的哈希表,因为 H 通常是一个机器字,并且随着 H / Length 的增加,性能越差。
然后我们开始实施khash-inspired 算法。这个具有很大的潜力,因为它的基准测试令人印象深刻,并且它可以处理同一阵列上的碰撞。它也有一些很棒的东西,比如在不需要两倍内存的情况下调整大小。
基准测试令人失望。当然,没有必要说我们实现的内存使用量比 Dictionary 的低得多。但我也希望能获得不错的性能提升,但不幸的是,事实并非如此。它并没有太低 - 不到一个数量级 - 但是对于 set 和 get 来说,.NET 的实现仍然表现得更好。
所以我的问题是:这是我们对 C# 最好的吗?我尝试寻找任何自定义解决方案,似乎几乎没有。有那个 C5 通用集合,但是代码太混乱了,我什至没有测试。而且我也没有找到任何基准。
所以...是这样吗?我应该直接绕过Dictionary<>吗?
【问题讨论】:
-
字典不存储 KeyValuePairs。
-
我已经体验到手动重新实现 .NET 集合无法与包含的实现竞争。我不知道为什么会这样,但我怀疑 CLR/JIT 在优化代码时会“作弊”,因为它对 .NET 容器有一些先验知识。
-
康拉德:这实际上是我最喜欢的答案! :)
-
查看相关:stackoverflow.com/questions/2151747/…。字典已经很快了。
标签: c# data-structures hash hashtable