FORCIA CUBEフォルシアの情報を多面的に発信するブログ

Shinjuku.rs #11を開催しました

2020.09.14

Shinjuku.rs Rust エンジニア

旅行プラットフォーム部の高橋です。フォルシアで隔月開催しているRustのLT会、Shinjuku.rsを先月も開催しました。前回は初めてオンラインで開催しましたが、今回も引き続きオンラインでの開催としました。

また先日、著者座談会の記事でも紹介しました、弊社が監修の『実践Rustプログラミング入門』が、8/22に秀和システム社より発売されました。おかげさまで、TwitterやRustコミュニティのSlackなどでも反響をいただいております。

その効果もあってか?これまでで最も多くの方にご参加いただき、Twitterやコメント欄も含め、大変盛り上がるLT会となりました。

前回のイベントの様子はこちらをご覧ください。

LTの様子

Rustでソートを高速化した話 | 浦上真之(フォルシア)

pic_01.jpg

今年フォルシアに新卒で入社した浦上が登壇しました。
競技プログラミングで世界大会に出場するほどの実力の彼ですが、競プロにからめてソートの高速化をRustで実装・ベンチマークを測定してみたという内容のLTをしてくれました。

配列をある条件でソートしてN番目からM番目を取り出す処理を考えます。一番素直な方法は配列全体をソートした後でN ~ M番目を取り出すというものかと思いますが、よくよく考えるとN~M番目以外の箇所についてはソートする必要ありません。そこに着目して、Rustでソート処理を実装してみたとのことです。

また、処理がどのくらい高速化できたのかを確認するため、「Criterion.rs」というライブラリを使ってベンチマーク取得してみたそうです。処理を複数回実行し、その結果を「いい感じで」HTMLとして出力してくれるツールで、手軽に使えてとても便利そうです。

pic_02.png

ベンチマークをとることで、今回の手法が通常のものと比較して9倍程度高速であること、また通常のソートでは配列の要素数をNとすると NlogNのオーダーで時間がかかるのに対し、今回の手法はNに比例する計算量であることがグラフから読み取ることが出来たということでした。

みなさま Rust のライブラリをベンチマークです。お教えしましょう! | ngtkanaさん

pic_03.jpg

意図的に発表順を決めたわけではないですが、一人目に引き続いてベンチマークのライブラリの話でした。以下のライブラリについて、使い勝手や特徴を紹介してくださいました。

  • bench
    • 公式なのでとても手軽
    • しかしnightlyでしか動かない
    • 機能としては実行時間を計測して平均を求めてくれるだけ
  • bencher
    • stableでも動く、benchの外部クレート
    • 機能としてはbenchとほぼ同様
    • black_box関数の性能が少し低い
  • Criterion
    • 計測結果をグラフにしてHTMLを作るところまでやってくれる
    • 統計的評価ができるだけでなく、ウォームアップをしたり高度な計測をしてくれている
    • テストケース単位での測定になるので、関数内部の処理時間まではわからない
  • Flame Graph
    • 処理のflame graphを作成することができる
    • このグラフを見ることで処理のボトルネックを特定することができる
    pic_04.png

それぞれのライブラリに一長一短はあるので、使いどころを見極めて使っていく必要がありそうです。

RustをWebAssemblyビルドしてクロスプラットフォームなライブラリをつくる | _tkato_さん

pic_05.jpg

複数のプラットフォームへのアプリのデプロイを共通化すべく、RustをWasmにコンパイルしてPythonから呼び出してみる、という内容でした。

現在はRustで作成したライブラリをPyO3 + Pythonで読み込み複数のプラットフォーム(クラウド、デバイス、Macなど)上で動かすということをしているそうですが、それだとプラットフォームごとにRustのバイナリのビルドが必要になり、手間になっているそうです。
そこでRustのコードをWebAssemblyにビルドすることで、一度のビルドで完結できるのではないか、と考え実用に耐えるかどうかをテストしてみたそうです。

Benchmark Gamesのソースを用いてベンチマークを測定した結果、Wasm + Pythonの処理速度をRustバイナリ + PyO3 + Pythonのものと比較すると、後者の方が数倍高速に動作したそうです。実行環境を選ばないというメリットをとるか、高速に動作する方をとるのか、そのあたりはトレードオフになりそうです。

俺のVecにはlower_boundがついてるけど、お前は? | 宇宙ツイッタラーXさん

pic_06.jpg

突然始まったライブコーディングに驚かされたLTでした(笑)。

RustのVectorにはbinary_searchという、ソートされた配列に対して引数で渡された要素eが含まれるかどうかを高速にサーチし、含まれる場合にはそのインデックスを返してくれる関数が実装されています。
しかし配列内に同じ要素eが複数含まれる場合、要素eを引数にbinary_seachした際に返される値はeのインデックスではあるものの、どのeのインデックスが返されるかは決まっていません。そこで要素が複数含まれる場合は一番最初に現れる箇所のインデックスを返すような lower_bound という関数を新たに追加したい気持ちになります。

その方法について、traitを用いて構造体にメソッドを追加できること、さらにmacroを用いて複数の型について同様のメソッドを実装できることをコーディングしながら紹介していただきました。

Rustの特徴的な機能について分かりやすく解説していただき、Rustを始めたばかりの方にとっても、とてもためになる発表だったかと思います。

RustでつくるRuby | monochromeさん

pic_07.jpg

RustでRubyの処理系rurubyを実装しているとのことで、その紹介をしていただきました。

RustでRubyを実装しようと思ったモチベーションは、Rubyの実装について詳しくなりたいと思ったからだそうで、それで自分で実装してみるというのはとても力強いなと感じました。Rubyには不思議な文法が多く、パーサーの実装はなかなか骨が折れるものだそうです。

Rubyと処理速度のベンチマークを比較するとまだ1 ~ 3倍程度遅いとのことで、さらに今後も言語機能整備・標準ライブラリ整備・高速化などに取り組んでいく予定とのことです。

次回のShinjuku.rs #12は10月20日(火)に開催予定です

以下のページから参加申し込みできます。

https://forcia.connpass.com/event/187287/

Rustを商用利用した話、Rustでこんなものを開発したぜ、Rustの面白い仕様を紹介したい、Rustにcontributeしたなど、Rustに関連する内容ならなんでもWelcomeです。皆様からのLTをお待ちしています。

この記事を書いた人

高橋 優樹

新卒2年目エンジニア。
旅行会社のwebアプリの保守運用をしています。