🌟

RubyMine2023.1.1のインデックス作成が死ぬほど重いので、死ぬほど重いgemを作った

2023/05/21に公開

RubyMine2023.1.1のインデックス作成が死ぬほど重い。

ブランチを変えても固まる。
gemを追加しても固まる。
なんかやるとすぐ固まる。
しかも数秒どころじゃない、分単位で。

何年かRubyMineを使っているけど、過去最悪のパフォーマンス問題だと思う。

issueは既に上がっていて"Fixed"になっているので、次回には直っているはず。
https://youtrack.jetbrains.com/issue/RUBY-31174/IDE-hangs-when-switching-branches

自分のところは小さいプロジェクトだからキレかけで済んでるけど、もっと大きなプロジェクトだったら仕事にならないんじゃないか?
というわけで、死ぬほど重いgemを作って試してみた。

インデックス作成とは

https://pleiades.io/help/ruby/indexing.html

RubyMine のインデックス作成は、IDE のコア機能であるコード補完、インスペクション、使用箇所の検索、ナビゲーション、構文のハイライト、リファクタリングを担当します。

gem内もインデックスの対象になっている。
これによって、RubyMineはgemの中にソースジャンプができたりする。(これがあるからRubyMineを使っている)
なので、めちゃくちゃでかいgemを入れればめちゃくちゃ重くなるはず。

作ったgem

クラスとインスタンスメソッドをたくさん定義している、それだけのgem。
https://rubygems.org/gems/too_heavy_gem/versions/0.1.2

クラス数:17,576個(AAA〜ZZZクラス)
メソッド数:38,614,472個(クラスごとにaaa~nnnメソッド)
gemのファイルサイズ:110.9MB

gemをインストールした結果

Railsプロジェクト内で、作ったgemをbundle installしてみる。

gem 'too_heavy_gem'
→bundle install

RubyMineでindex作成が始まった!!!

CPUは常にフル稼働し、ほとんど聞いたことがないM1 iMacのファンが鳴り続ける。

15分後

一応進んでいたプログレスバーが、なんか初めからになってる。

1時間後

食事から戻って見てみるも、終わっていない。初めから作り直しを繰り返している模様。
ストレージは余裕あるし、メモリの増減も無いように見える。何なんだろう。

なんだかんだコード補完やジャンプまで動かるようになって、「頑張ったな・・・!」と言ってやりたかったけど、ただただ常時リソースを食いまくるだけの存在になってしまった。

おしまい

余談(rubygemsのファイルサイズ上限)

メソッドをnnnまでじゃなくてzzzまでにすると以下のようになる。

メソッド数:308,915,776個(クラスごとにaaa~zzzメソッド)
gemのファイルサイズ:767.7MB

↑これを試しにrubygemsにリリースしてみようとしたらエラーが返ってきた。

We are having a bad problem and the app server will not talk to us.

エラーメッセージからは原因は分からないけど、おそらくサイズ上限ではじかれてる。
rubygemsのファイルサイズ上限は調べても出てこないけど、110.9MB〜767.7MBの間にあるっぽい。

Discussion