openSUSEにPHPプロファイラー:xhprofインストール
最近も、やれLaravelの効率がどうのこうのという話が流されます。まあ、現状Composerに乗り、「車輪の再発明」を避ける用に開発されているLaravelは、その方針から、どうしても外部ライブラリーに頼ることになり、動作に必要なコンポーネントを自ら実装するフレームワークに対し、効率の面で劣ってしまうのは、致し方ない部分です。現状、Laravelを試すだけでなく、実際に使用している人たちは、そうした面を理解し使用しているのですから、今更感があります。
とはいえ、Laravel4になってから、全体の実行プロファイリングの結果を見ていなかったので、現在開発している個人プロジェクトで、どんな結果になるか見てみようと思いました。
そう言えば、コーリンググラフを出してくれるものがあったなと、xhprofを思い出し、現在使用しているopenSUSE13.1で動かしてみることにしました。
インストール
公式リポにはなかったので、ブラウザからソフトウェア検索で探します。すると個人ユーザーの方で、ビルとを公開している方が二名いたので、それを使わせてもらいました。ワンクリックインストールで完了です。
後は自分のディレクトリーにworksという作業ディレクトリーを作成し、以下の2ディレクトリーをコピーしておきます。
- /usr/share/php5/xhprof/xhprof_html
- /usr/share/php5/xhprof/xhprof_lib
今回、私の環境では、動作に必要なGraphvizというパッケージが予め入っていました。インストールしていない場合は、導入しておく必要があります。
設定
/etc/php5/conf.d/xhprof.iniが設定ファイルです。その中の出力ディレクトリーを自分の作業ディレクトリーにコピーした、xhprof_htmlに設定します。
xhprof.output_dir=/home/hiro/works/xhprof_html
仮想ホスト
仮想ホストを上記で設定したディレクトリーへアクセスするように、設定します。
今回はxhprof
というドメイン名で、前記ディレクトリーへアクセスするように設定しました。
index.phpの変更
Laravelのpublicフォルダーにある、index.phpを以下のように変更します。
<?php xhprof_enable(); // start profiling require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/start.php'; $app->run(); $xhprof_data = xhprof_disable(); // end profiling $XHPROF_ROOT = '/home/hiro/works'; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof"); echo "<a href=\"http://xhprof/index.php?run=$run_id&source=xhprof\">プロファイル結果</a>";
後は、通常通りにページを表示すれば、最後に結果を確認するためのリンクが表示されます。
セッションごとに500Kほどのファイルがxhprof_htmlディレクトリーに作成されますので、こまめに削除しましょう。
結果は?
特定の重い処理を何度も呼び出しているような、典型的なボトルネックではなく、やはり様々なクラスを呼び出しているがための、重さでしょう。
コーリンググラフを張ることも、ちょっと思い浮かんだのですが、環境が違えば、結果も異なり、Hello Worldだけのものや、実用的なDBアクセス+認証処理なんかじゃ、そりゃ異なります。公開することに意義がないので止めました。重いですしね。グラフは。
そもそも、今回の結果は開発環境のSSD上で行いましたが、HDではまた変化するでしょうし、ストレージがDBなのか、オンラインサービスか、オンメモリか、compiled.phpを作っているか、いないか、はたまた…とバリエーションも多いですので、やはり意味が見いだせませんでした。もうちょっと、実用的な記事を考えています。