Symfony2のパフォーマンスをアップする簡単な方法


[追記とお詫び]
APC有効の場合の値が正しく測定できていませんでした。
当初は20倍という結果になってましたが、再測定の結果4倍になりました。
すんごい悪くなったような気がしますが、4倍"も"速くなったと前向きに捉えてます。
なにわともあれ、正しくない情報で最初にレポートしてしまい申し訳ありませんでした。



PHPフレームワークの比較が流行っていますね。

Symfony2のベンチマークが当初はCake2の半分程度しかなかったのですが、今のようにより速くなったのは、@hidenorigotoさんが不要なファイルの読み込みをコメントアウトしたりというごくごく普通のアプローチで修正を加えた結果です。(とはいえ、自分も気づかなかったですがw Good Job! @hidenorigoto)

APCを使わないはずがないよね。

あと、Symfony2を動かすのにconfig.phpでチェックしていればAPCはもちろん入ってますよね。
であれば、以下の公式サイトのドキュメントを参考にしてみましょう。

要するに、「file_existsが呼ばれまくって遅くなってるからAPC対応のローダー使うと速いよ!」ってことのようです。
なので、公式ドキュメントに従って以下のようにApcUniversalClassLoaderメソッドを使うように修正します。
元のソースは最初に紹介したベンチマークで利用されているSymfony2のサンプルアプリを使います。

  • app/autoload.php
<?php
...
require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
$loader = new ApcUniversalClassLoader();

ab結果

brew install で最初に紹介したベンチマークと同じコマンドを使おうかと思ったのですがエラーになるので素直にabを手元のmac book air(1世代前) で簡易的にやってみました。

$ ab -n1000 -c10 http://localhost/symfony2-sample-application.git/web/app.php/blog/1
APC無し (UniversalClassLoader)
  • 結果: 10.75 [#/sec]
Concurrency Level:      10
Time taken for tests:   93.019 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      816000 bytes
HTML transferred:       496000 bytes
Requests per second:    10.75 [#/sec] (mean)
Time per request:       930.193 [ms] (mean)
Time per request:       93.019 [ms] (mean, across all concurrent requests)
Transfer rate:          8.57 [Kbytes/sec] received
APC有効 (ApcUniversalClassLoader)
  • 結果: 217.10 42.11 [#/sec]
Concurrency Level:      10
Time taken for tests:   23.748 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      816000 bytes
HTML transferred:       496000 bytes
Requests per second:    42.11 [#/sec] (mean)
Time per request:       237.484 [ms] (mean)
Time per request:       23.748 [ms] (mean, across all concurrent requests)
Transfer rate:          33.55 [Kbytes/sec] received

20倍?? 4倍でした。ごめんなさい。
APCを使っていないときが遅すぎる気もしたり、どれほど速くなるかの詳しい検証は別としてもAPCは標準で使うぐらいでないと駄目ですね。