Guava'sImmutableSet
は、に関する私のベンチマークではかなりパフォーマンスが悪いよう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);
これにはほぼ同じ時間がかかり、いくつかの欠点があるかもしれませんが、ハッシュをうまく広げることで現在の問題を解決します。