【发布时间】:2012-09-16 09:51:09
【问题描述】:
Guava 的ImmutableSet 在我关于contains 的基准测试中似乎表现很差。对于某些尺寸,它甚至比 List 慢得多:
size benchmark ns linear runtime
100000 ListContains 110279.54 ==
100000 SetContains 7.15 =
100000 ImmutableSetContains 76716.47 =
200000 ListContains 275367.66 =====
200000 SetContains 7.34 =
200000 ImmutableSetContains 322185.50 ======
500000 ListContains 935210.10 ====================
500000 SetContains 7.79 =
500000 ImmutableSetContains 1382765.76 ==============================
基本上,我用几千个负整数填充一个集合,并用非负整数测试包含。代码很琐碎,但在小文本区域粘贴有点太长了,所以请看here。
我想知道这里发生了什么。可能,我遇到了一些退化的情况,尽管我显然没有尝试这样做。或者,也许我刚刚打破了基准。否则,我想知道它是否可以并且应该被修复。
解决方法是通过replacing更改涂抹功能
hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12);
return hashCode ^ (hashCode >>> 7) ^ (hashCode >>> 4);
通过
return C2 * Integer.rotateLeft(hashCode * C1, 15);
这需要大约相同的时间并且可能有一些缺点,但通过很好地散布散列解决了当前的问题。
【问题讨论】:
-
是的,你遇到了一个严重退化的案例。但这可能不应该出现在 SO 上;应该是问题报告。
-
我现在明白了...我必须先写问题,但实际上很明显。
-
@Louis Wasserman:我几乎可以肯定我搞砸了(发生了其他奇怪的事情);这就是为什么我想先在这里问。我想我找到了一个不错的解决方案。
-
在 Guava 14 中修复:code.google.com/p/guava-libraries/issues/…
标签: set guava immutability caliper