groonga / grnxx

groonga++
Other
7 stars 0 forks source link

RowID, Score による整列を特殊化する #119

Closed s-yata closed 9 years ago

s-yata commented 9 years ago

概要

現在は Expression を介して取得した値を基準に整列しているのですが, RowID, Score による整列では Record の一覧に最初から入っているわけで,完全に無駄になります. 実装においては,整列の基準に使う値を別の配列に入れる必要がなくなるため,効率の面からすると,個別に実装するのがよさそうです.

Expression の内容が RowID, Score 単体かどうかを確認できるようにすれば,後は Sorter 側で実装を用意すれば片付くはずです.

s-yata commented 9 years ago

結論

RowID, Score 向けに特殊化してみたのですが, Score については良い結果が得られなかったため無効化しました. 現在は RowID 向けの特殊化のみが有効になっています.

Score の特殊化が失敗した理由は, Score をそのまま使って整列するより, uint64_t へと変換して別の配列に格納しておき(#117),それを使って整列する方が速いからと考えられます.

試しに 2^21(約 210 万)レコードの整列を試してみた結果を以下に示します. 数字は整列の所要時間です.

RowID はランダム順にしたレコード一覧の整列です. Score_1[0.0, 1.0] に収まる 256 種のスコアに基づく整列です. Score_2[0.0, 1.0] に収まる 65,536 種のスコアに基づく整列です. Score_3[0.0, 1.0] に収まるスコア(ほぼ重複なし)に基づく整列です. ただし, Score_* については 25% の割合で N/A を混ぜてあります.

Sort conditions Old [s] New [s]
RowID 0.191 0.175
Score_1 0.076 0.084
Score_2 0.130 0.159
Score_3 0.156 0.199

RowID の Old と New の差は 10% 以下であり, Score_* については Old の方が速いという結果になりました.