Closed s-yata closed 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 の方が速いという結果になりました.
概要
現在は Expression を介して取得した値を基準に整列しているのですが, RowID, Score による整列では Record の一覧に最初から入っているわけで,完全に無駄になります. 実装においては,整列の基準に使う値を別の配列に入れる必要がなくなるため,効率の面からすると,個別に実装するのがよさそうです.
Expression の内容が RowID, Score 単体かどうかを確認できるようにすれば,後は Sorter 側で実装を用意すれば片付くはずです.