こんにちは!Wantedlyでエンジニアをしている江草・新谷です。
今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、Twitterをフォローしてくださった方には技術書や開発に役立つ Engineering Handbook をプレゼントしています!
2日目の会場では弁当と一緒に松阪牛のすき焼きが配られていました。とても柔らかくておいしかったです。
本記事では、2日目の Make RuboCop super fast について紹介させていただきます。
Make RuboCop super fast
RubyKaigi公式ページ: https://rubykaigi.org/2022/presentations/koic.html#day2
スライド: https://speakerdeck.com/koic/make-rubocop-super-fast
RuboCop 2×2
RuboCop は Ruby 3×3(Ruby 3系では2系の3倍の高速化を目指す)にちなんで RuboCop 2×2 をコンセプトに rubocop コマンドの高速化にフォーカスした改善を行っていました。
- キャッシュ
- キャッシュディレクトリを作成し、解析結果をキャッシュする
- 並列化
- multi core を十分に活かせるように並列で rubocop を走らせる
- 読み込みファイルの削減
- require ‘rubocop’ に時間がかかっていることが分かっているため、読み込むファイルをへらす
- Deamonize
- rubocop コマンドを実行するたびに process を起動するのではなく、process を常駐させる
どれも効果があったとの話をされていましたが、今回のセッションは deamonize を実現するために作った server オプションの話がメインでした。
RuboCop Server Option とは?
RuboCop 1.31 から導入された新しい実行オプションです。
これまでは rubocop コマンドを実行するたびに1からプロセスを起動し、処理を行っていました。
しかし、Server Option を利用し Server Mode で RuboCop を起動させることでこれまでの 850倍(!)もの速度で RuboCop を実行することができます。
RuboCop Server Mode
Server Mode で起動した場合の RuboCop の挙動について紹介します。
Server Mode では Client/Server モデル によって RuboCop が動作します。
Server
サーバ側プロセスでは、require などの時間のかかる処理が一度だけ実行され deamon として常駐し、2回目以降の rubocop コマンドでは再利用されます。
また、require するファイルもサーバとして動作する分で十分なので、読み込みファイルの削減にも寄与しています。
Client
クライアント側プロセスでは、サーバ側プロセスに TCP socket で問い合わせることにより rubocop コマンド実行毎に諸々のファイルを読み込むことを回避しています。これによって、大幅な速度改善を行うことができました。
設計の話 `rubocop server` vs `rubocop-server`
server mode を実装するにあたって、rubocop コマンドに --server
オプションをつけてサーバーを起動するようにするか、 rubocop-server
のような別コマンドでサーバーを起動するようにするか、大きく2つの選択肢がありました。
rubocop-deamon を使っている人達は、できれば何もせずに rubocop コマンドが速くなってほしいと考えているはずです。
また、 emacs server を起動するのが面倒で emacs コマンドにエイリアスを貼って自動でサーバーが起動するようにした経験から、rubocop-server という別コマンドにするのではなく、rubocop のオプションとして server mode を実装することにしたそうです。
Server Mode の今後の展望
最後に Server Mode の今後の展望について紹介されていました。
- 3rd party gem を upgrade した時に autoload できるようにする
- Unix domain socket を使って高速化する
- `--server` オプション の short elias を作る
- JRuby のサポート
感想
まだデフォルトでは有効にならず `--server` オプションをつける必要はありますが、 rubocop コマンドが850倍も速くなるとのことなので、かなりうれしい変更ではないでしょうか。
まだ、experimental な機能で一部動作が不安定なところもあるそうですが、直接 production の動作に影響があるわけではないので、server mode を使っていきたいと感じました。
#8 次のブログへ👇