marisa-trie の高速化と実験結果(続き)

概要

昨日の実験結果(marisa-trie の高速化と実験結果 - やた@はてな日記)では索引のサイズを変更した結果を表にしていたわけですが,索引のサイズ以外にも変更した部分があったため,その部分のみを適用した結果を調べてみました.

変更箇所

select() の実装において,最初の二分探索(512-bit 単位)を(探索範囲が小さいときだけ)線形探索に切り替えました.クイックソートにて,範囲が狭くなると挿入ソートにするのと同じ感覚です.なお,条件文を減らすために,線形探索用の番兵を追加しています.

後は,select() を使わない BitVector から select 用の索引を取り除くなど,空間効率の面で少し修正しています.こちらは元よりアクセスしない部分なので,検索時間には影響なしです.

実験結果

  • 実装の種類
    • Version: 0.1.0
    • Version: 0.1.1(2011-02-18 現在の最新版)
      • 無駄な rank() の呼び出しを取り除いたもの
    • Version: 0.x.y
      • 二分探索を線形探索に切り替え,不要な索引を取り除いたもの
  • キー集合
    • 内容:日本語 Wikipedia のタイトル一覧(jawiki-20101102-all-titles-in-ns0.xz)
    • キー数:1,146,584
    • キー長の合計:23,809,474 bytes

検索時間の単位は [us/key] です.

キーの並び:昇順
------+---------+---------+-------+-------+-------+-------+-------+-------
#tries    #nodes      size   build restore  lookup    find predict predict
                                                           breadth   depth
                   [bytes]    [us]    [us]    [us]    [us]    [us]    [us]
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.1.0
     1   1564294   9850414   3.323   1.265   1.404   1.500   1.605   1.692
     2   2087639   7056713   3.593   2.407   2.564   2.678   2.782   2.896
     3   2264302   6522559   3.733   2.791   2.948   3.079   3.183   3.279
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.1.1
     1   1564294   9850414   3.314   0.994   1.143   1.238   1.317   1.439
     2   2087639   7056713   3.593   1.840   2.006   2.128   2.215   2.320
     3   2264302   6522559   3.733   2.102   2.302   2.433   2.512   2.625
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.x.y
     1   1564294   9834950   3.340   0.898   1.055   1.160   1.212   1.308
     2   2087639   7033077   3.602   1.631   1.814   1.936   1.971   2.102
     3   2264302   6496167   3.742   1.901   2.076   2.198   2.233   2.364
------+---------+---------+-------+-------+-------+-------+-------+-------

キーの並び:ランダム順
------+---------+---------+-------+-------+-------+-------+-------+-------
#tries    #nodes      size   build restore  lookup    find predict predict
                                                           breadth   depth
                   [bytes]    [us]    [us]    [us]    [us]    [us]    [us]
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.1.0
     1   1564294   9850414   4.474   2.294   2.747   2.939   3.070   3.166
     2   2087639   7056713   4.675   3.733   4.265   4.483   4.588   4.710
     3   2264302   6522559   4.814   4.143   4.701   4.963   5.015   5.146
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.1.1
     1   1564294   9850414   4.483   1.971   2.425   2.608   2.695   2.835
     2   2087639   7056713   4.675   3.114   3.602   3.794   3.890   4.012
     3   2264302   6522559   4.823   3.419   3.951   4.151   4.239   4.361
------+---------+---------+-------+-------+-------+-------+-------+-------
Version: 0.x.y
     1   1564294   9834950   4.483   1.866   2.364   2.547   2.608   2.730
     2   2087639   7033077   4.692   2.896   3.436   3.628   3.680   3.803
     3   2264302   6496167   4.823   3.201   3.759   3.960   4.012   4.134
------+---------+---------+-------+-------+-------+-------+-------+-------

思いのほか良い性能を発揮しました.さすがに索引のサイズを大きくした場合と比べれば遅いのですが,Version 0.1.1 と Version 0.x.y を比較すると,Version 0.x.y の方が明らかに高速です.

残念ながら辞書の互換性は失われてしまいますが,辞書のサイズを減らしつつ,検索時間も短縮できるということで,ソースコードを少し修正してから Version 0.2.0 にしようと思っています.