Geeklogの性能測定
- 2008年10月 4日(土) 07:03 JST
- 投稿者: mystral-kk
- 表示回数 5,246
Geeklog-1.5.0からは$_CONF変数がデータベースに格納されるようになったが、その実装方法があまりきれいではないので、速度低下を招くのではないかと思い、ひろろんさんやdengenさんと共にごく簡単なキャッシュを実装していた。大ざっぱに言うと10%程度のスピードアップになりそう。
そのとき話題になったのがlib-common.phpのダイエット。このファイルはGeeklogの基本機能を実装し、必要なライブラリをインクルードしているが、1.5.1で200KBほどある。このlib-common.phpの中でも比較的使用されていないコードやインクルードファイルがあれば、使用時にインクルードすることで、サイズを減らせる。
きちんと性能測定したいなあと思ってXdebug関連を探していたら、[PHPプロファイリング: Xdebug(Xdebug2) + WinCacheGrind]というページを見つけた。早速このページの情報を元に、
- XdebugのMS Windows用最新モジュール(php_xdebug-2.0.3-5.2.5.dll)をダウンロードしてPHPのエクステンション用ディレクトリにコピー。
- WinCacheGrindをダウンロードして、インストール。
- php.iniの書き換え。
[Zend] zend_extension_ts = "C:\PHP\ext\php_xdebug-2.0.3-5.2.5.dll" xdebug.profiler_enable = 1 xdebug.profiler_output_name = cachegrind.out.profile xdebug.profiler_output_dir = "C:/temp/xdebug" xdebug.auto_trace = On
Geeklog-1.5.1のトップページにアクセスすると、lib-common.php処理にかかる時間は以下のようになった。
キャッシュなし | キャッシュあり | |||
---|---|---|---|---|
実行時間(ms) | 比率(%) | 項目 | 実行時間(ms) | 比率(%) |
26.4 | 52.2% | lib-common.php読み込み | 20.6 | 61.7% |
11.9 | 23.6% | config->initConfig() | 0.4 | 1.2% |
3.1 | 6.2% | config->loadBaseConfig() | 3.6 | 10.7% |
1.8 | 3.6% | SEC_getUserGroups() | 1.8 | 5.5% |
1.0 | 2.0% | lib-syndication.php読み込み | 0.8 | 2.4% |
0.6 | 1.3% | lib-session.php読み込み | 1.1 | 3.4% |
0.4 | 0.8% | SEC_getUserPermissions() | 0.4 | 1.2% |
0.4 | 0.8% | lib-plugins.php読み込み | 0.6 | 1.9% |
0.1 | 0.2% | japanese_utf-8.php読み込み | 0.1 | 0.3% |
0.2 | 0.4% | setlocale() | 0.4 | 1.2% |
50.6 | 合計 | 33.4 |
テスト環境は、Pentium M 1.1GHz、メモリ1.25GB、Windows XP+SP3、PHP-5.2.5、Apache-2.0.63、MySQL-4.0.18ntで、5回アクセスの平均値。
キャッシュなしの方では、lib-common.phpの処理に合計で50.6ミリ秒かかり、そのうちlib-common.phpの読み込み自体に26.4ミリ秒かかっている。キャッシュありの方では、lib-common.phpの処理に合計で33.4ミリ秒かかり、そのうちlib-common.phpの読み込み自体に20.6ミリ秒かかっている。
キャッシュありの方は、config->initConfig()の実行時間が大幅に短くなっている。config->loadBaseConfig()の時間は依然として長いが、これは内部でlib-database.phpをインクルードし、データベースに接続しているためで、短縮は難しそう。SEC_getUserGroups()に時間がかかるのはソースコードに注釈がある通り(lib-security.phpの88-90行目)だが、何らかのキャッシュ機能を実装できる可能性がある。となるとやはり、全体の50%から60%の時間を占めているlib-common.php自体の読み込みがボトルネックになる。もう少し、詳しく調べてみるつもり。