比較対象は次の3つ。
- Long.bitCount(long)
- Long.bitCount(long) のソースをコピーして作った関数
- it.unimi.dsi.bits.Fast.count(long)
- 278
- 2269
- 1636
Long.bitCount(long) の呼び出しが BIOS コールのエミュレーションのように POPCNT に変換されているのかな?
ついでに dsiutils-2.0.7.jar の it.unimi.dsi.bits.Fast.count(long) も計測したんだけど、意外にも速かった。「broadword algorithm」というのは、Java ライブラリの実装アルゴリズムよりも速いんだろうか?
Broadword implementation of rank/select queriesざくっと計ったので、参考まで。
http://vigna.dsi.unimi.it/papers.php#VigBIRSQ