1
/
5

RubyKaigi 2022 参加記 #7 - Make RuboCop super fast (Day 2)

こんにちは!Wantedlyでエンジニアをしている江草・新谷です。

今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、Twitterをフォローしてくださった方には技術書や開発に役立つ Engineering Handbook をプレゼントしています!

WantedlyはRubyKaigi2022にプラチナプランとして協賛し、技術書と開発に役立つHandbookをブースでプレゼントしています #rubykaigi | Wantedly, Inc.
こんにちは!Wantedlyで技術イベント企画まわりを担当しています竹内みずき (@amanda__mt)です! いよいよ本日から3日間、 RubyKaigi 2022 が開催されますね!私たちはこの度プラチナスポンサーとして協賛させていただき、三重県現地にて参加する運びとなりました。 直近2年間はほぼすべてのカンファレンスやイベントがオンラインでの開催となり、今回は久しぶりの ...
https://www.wantedly.com/companies/wantedly/post_articles/430335

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 から導入された新しい実行オプションです。

Server Mode
The server mode was introduced in RuboCop 1.31. If you're using an older RuboCop version you can check out the rubocop-daemon project that served as the inspiration for RuboCop's built-in functionality. You can reduce the RuboCop boot time significantly (
https://docs.rubocop.org/rubocop/usage/server.html

これまでは 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 を作る
    • `-s` は他の機能で使われている
  • JRuby のサポート

感想

まだデフォルトでは有効にならず `--server` オプションをつける必要はありますが、 rubocop コマンドが850倍も速くなるとのことなので、かなりうれしい変更ではないでしょうか。

まだ、experimental な機能で一部動作が不安定なところもあるそうですが、直接 production の動作に影響があるわけではないので、server mode を使っていきたいと感じました。


#8 次のブログへ👇

RubyKaigi 2022 参加記 #8 - How fast really is Ruby 3.x? (Day2) | Wantedly Engineer Blog
こんにちは!2022 年にWantedly に新卒入社し、DX Squad でエンジニアをしている大森です。 今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、Twitterをフォローしてくださった方には技術書や開発に役立つ Engineering Handbook をプレゼントしています! 2日目のお昼は天むすを頂きました。天むす発祥のお店の天むすらしく
https://www.wantedly.com/companies/wantedly/post_articles/431185
Wantedly, Inc.では一緒に働く仲間を募集しています
4 いいね!
4 いいね!
同じタグの記事
今週のランキング
Wantedly, Inc.からお誘い
この話題に共感したら、メンバーと話してみませんか?