Rustコトハジメ

プログラミング言語Rustに関する情報をお届けします。

flameを使ってボトルネックを可視化する

私は今、エディタを開発しています。

Ijk: A real editor for real programmers - announcements - The Rust Programming Language Forum

やるべきことは色々あるのですが、その中でもボトルネックを可視化する作業の優先度を上げました。なぜかというと、Rustでは、ここ3年くらい仕事で使ってきたScalaに比べると、所有権などがある関係で、設計を根本から変更することのコストが高いと思うため、

  • あとになって性能を改善するためには設計を根本から改善しなければいけないことに気づく
  • 指標がないまま早まった最適化をして設計が必要以上に複雑になる

ということを避けたいからです。

ボトルネックを可視化する方法として有名なものにフレームグラフがあります。作ったのは今はネットフリックスにいるパフォーマンスを専門とするエンジニアですが、たぶん、LinuxCon Japanにも来たことがあるような気がします。

フレームグラフを生成するRustライブラリは、

GitHub - TyOverby/flame: An intrusive flamegraph profiling tool for rust.

があり、私はこれを使っています。

この計測用コードをマクロで生成するライブラリとしてflamerがありますが、私は使っていません。結局、どこが遅いかがわかれば良くて、細かい絵を描きたいわけではないため、むしろ図を見た時にわかりやすくなるように丁寧に自分で計測用コードを置いていく方が良いと考えるからです。また、「見て解析出来る程度の規模でしか計測用コードを埋め込まない」と考えれば、その数は別に半自動化するほどのものではないでしょう。

今日一日で、シンタックスカラーリングまで実装することが出来ましたが、

f:id:akiradeveloper529:20190316191523j:plain

f:id:akiradeveloper529:20190316193845j:plain

現状では、シンタックスカラーリングを計算する部分(syntectというライブラリを使っています)が時間を食っていることがわかります。今後は、性能を改善するのであればここを削っていくことになると思いますが、実際に使っていてそこまで遅いとは感じないのと、今後機能を追加していくと希釈される可能性が高いため、このまま行くかも知れません。いずれにしろ、フレームグラフを作ったことによって、シンタックスカラーリングの部分を極端に改善しても3−4倍程度しか改善しないということがわかりますから、これは今後の判断に役立つでしょう。