Rustでソートを高速化した話
浦上 真之
2020/8/25 Shinjuku.rs
Rustで(特定の条件下での)ソートを
高速化(するために選択アルゴリズムを実装)
した(ら当然速くなった)話
浦上 真之
2020/8/25 Shinjuku.rs
自己紹介
• フォルシア株式会社
• 今年入社
• Webエンジニア
• インメモリデータベース開発(Rust)
• Rust歴 : 約1か月
• 趣味 : 競技プログラミング
• ICPC(国際大学対抗プログラミングコンテスト)で
世界大会への出場が決定
→コロナ禍で大会が延期に
1
:
1
:
8
今日のLT内容
今日のテーマ
DBでよくあるクエリ
SELECT * FROM てーぶる WHERE じょうけん
ORDER BY そーときー OFFSET ほげ LIMIT ふが
を速くしたい!!!!
問題文っぽく簡略化
長さNの数列 A[0], A[1], ... , A[N-1] があります。
これを昇順に並べ替えたときの、offset番目からoffset + limit 番目までの
要素をなるべく速く求めてください。
N(テーブルの要素数): 大きい(今回は100万くらい)
limit(取り出す要素数): 小さい(今回は100)
一般的なソートアルゴリズムの例(クイックソート)
3 7 2 9 8 6 1 10 4 5
3 2 6 1 4 5 7 9 8 10
2 1 3 6 4 5 7 8 9 10
1 2 3 4 5 6 7 8 9 10
適当に要素を1つ選んで大小に分ける
それぞれの区間ごとに繰り返す
工夫(3~5番目が欲しい場合)
3 7 2 9 8 6 1 10 4 5
3 2 6 1 4 5 7 9 8 10
2 1 3 6 4 5 7 9 8 10
2 1 3 4 5 6 7 9 8 10
並び替える必要がない!
実装例
どれくらい速くなるの?
• ベンチマークをとってみる
• Criterion.rs を使用 (https://github.com/bheisler/criterion.rs)
いい感じのHTMLを出力してくれる
他にも。。。
• 前回との差分を見る
他にも。。。
・複数の関数を比較、入力を変化させて実行
limit = 0, offset = 100
固定で配列の大きさを
変化させた場合
ご清聴ありがとうございました

Rustでソートを高速化した話(Shinjuku.rs)