Larastan の baseline ファイルを PHP 形式に変えてみた (NEON 形式との実行速度の比較付き)

こんにちは。エンジニアの濱田 (@hamakou108) です。

先日、とあるプロジェクトに Larastan を導入しました。

tech.macloud.jp

この記事の中で、 baseline ファイルを利用して既存のエラーを検知対象から除外する方法について紹介しました。 baseline ファイルには .neon というあまり見慣れないファイル形式が使用されていますが、先日 PHP ファイル形式でも baseline ファイルを作成できるようになりました。

zenn.dev

ドキュメントによると、 .neon ファイルよりも PHP コードの方が速く処理される 1 ようです。そこで baseline ファイルを PHP コードに変更し、簡単ですが、パフォーマンスについて計測してみることにしました。

baseline ファイルを neon から PHP に変更する方法

まず phpstan-baseline.neon を削除し、 phpstan.neon から baseline ファイルの指定を削除します。

includes:
#    - phpstan-baseline.neon

次に PHP ファイル形式で baseline ファイルを新たに生成します。

$ phpstan analyse --generate-baseline phpstan-baseline.php

再び phpstan.neon に戻り、新たに生成された baseline ファイルを指定します。

includes:
    - phpstan-baseline.php

この状態で phpstan analyse が通れば変更完了です。

実行時間を比較してみる

対象のプロジェクトでは CircleCI を用いて各コミットで Larastan をジョブとして実行するようにワークフローを組んでいます。ジョブの実行時間を CircleCI の API を用いて集計し、 baseline ファイル変更前後のパフォーマンスを比較してみました。なお、厳密な条件下で計測しているわけではないため、参考程度に捉えていただければと思います。

  • baseline ファイルの行数は変更前後ともに約4万行 (約2MB)
  • baseline ファイルの行数には数十行から数百行の変動あり
  • コードのチェックアウトや composer install などの事前処理の時間も含む

集計すると次のような結果になりました。

baseline ファイル 実行回数 実行時間の平均値 (秒) 実行時間の中央値 (秒)
phpstan-baseline.neon 100 339.92 338
phpstan-baseline.php 100 346.15 347

ご覧の通り、パフォーマンスの改善は特に見られませんでした... (むしろ遅くなっている?)。調べてみると、 Larastan の実行時間には2分程度のばらつきがあり、仮にパフォーマンス改善効果があったとしても、それがかき消されてしまっていると推測されます。またドキュメントでは「MB サイズに及ぶ過剰な baseline ファイルのパースのパフォーマンスやメモリ消費が改善される可能性がある (著者訳)」と言及されており、今回の baseline のファイルサイズ (約2MB) だとあまり恩恵を受けられないのかもしれません。

まとめ

今回は baseline ファイルを PHP ファイル形式に変更する方法と実行速度の比較について紹介しました。結果として実行速度は有意に改善されませんでしたが、特にプラグイン等を導入しなくても IDE 上でシンタックスハイライトが付くといった速度以外のメリットもあるので、個人的には PHP ファイル形式で baseline ファイルを作成することをオススメします。もし実行速度が改善されたという情報をお持ちの方がいらっしゃれば、ぜひ Twitter 等で教えてください!

最後に宣伝ですが、M&Aクラウドでは一緒にプロダクト開発してくれるメンバーを募集しています! カジュアル面談はもちろん、社内メンバーと軽くご飯に行くだけでも構いませんので、気になる方はぜひ Twitter DM や Wantedly 等でご連絡ください!

sg.wantedly.com