番石榴的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 ==============================
基本上,我填一组与几千负整数,并测试包含非负的。 该代码是微不足道的,但有点太长时间在一个小的文本粘贴区域,所以请看这里 。
我不知道是怎么回事。 也许,我击出了一些退化的情况下,虽然我明明没有尝试。 或者,也许我只是吹了标杆。 否则,我不知道是否可以而且应该固定。
解决的办法是通过改变涂抹功能替换
hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12);
return hashCode ^ (hashCode >>> 7) ^ (hashCode >>> 4);
通过
return C2 * Integer.rotateLeft(hashCode * C1, 15);
这大约同一时间,可能有一些缺点,但很好地散布散列解决当前的问题。