PhalconのORMは本当に速いのか?
この記事はPhalcon Advent Calendar 2014の5日目です。昨日はyohgakiさんの「Phalcon2.xのRPMパッケージを作る」でした。
最速と言われるPHPフレームワークのPhalcon。
Hello Worldベンチマークでは、高速と言われるCodeIgniterの約2.5倍、重量級と言われるSymfonyの約14.2倍、Laravelの約15.5倍の数字を叩き出しました。
また、そのORMに関しても、以下のような情報があります。
ORMを使うと、約16倍の速度差 -- http://www.slideshare.net/yujiotani16/phalcon-37768016/27
Fuelに比べ4倍程度多くのリクエストを捌いています。 -- https://www.atage.jp/archives/1943/
ということで、ORMについても本当に速いのかベンチマークしてみたいと思います。
以下の3つのORMをベンチマークしてみました。
- Eloquent ORM 4.2.x-dev
- FuelPHP 1.8-dev ORMパッケージ
- Phalcon 1.3.4 Model
EloquentはLaravelに含まれているORMです。PhalconではModelがORMになっています。
ベンチマーク環境
- CentOS 6.5 64bit (VM)
- PHP 5.5.19
- Zend OPcache v7.0.4-dev
- MySQL 5.1.73-3.el6_5.x86_64
- Apache 2.2.15-39.el6.centos.x86_64
- PHP 5.5.19
この環境は、「Phalconの開発環境をvagrant-centos6-phpを使い構築する」にある「vagrant-centos6-php」で簡単に構築できます。
ベンチマーク方法
テーブル構造は、「Yii2.0-beta v.s. Laravel4.1 ベンチマーク」のほぼコピーです。
CREATE TABLE IF NOT EXISTS `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`body` text NOT NULL,
`created_at` int(11) NOT NULL,
`updated_at` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`body` text NOT NULL,
`created_at` int(11) NOT NULL,
`updated_at` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_comment_post_id` (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上記のpost
has many comment
という構造のテーブルで、idを指定して1件のpost
テーブルのレコードとコメントを取得して、post
のtitle
と最新のcomment
のbody
を1件表示させました。
そのページにlocalhostからHTTPで10回アクセスし、その平均値を取得しています。
処理時間は、ORMでの処理時間のみを計測しています。 メモリ使用量は、ORMでの処理の前後でメモリ使用量を取得して引き算しました。
つまり、HTTPリクエストを発行してベンチマークしていますが、ネットワークやApache、フレームワークのオーバーヘッドは計測対象外で、純粋にORMの性能を見ています。
余談ですが、今回のベンチマークコードは、FuelPHP 1.8-devの上に作成しました。これは、FuelPHP 1.xがそのORMと密結合しており、ORMだけを取り出すのが困難だったからです。同様にYii2のORMをFuelPHPに載せる方法もよくわからなかったので計測対象にしていません。
詳細はソースコード(後述)をご覧ください。
ベンチマーク結果
処理時間
処理にかかった時間(ミリ秒)です。少ない方がよい値です。
メモリ使用量
処理後から処理前のmemory_get_usage()
の値を引いたものです。
結果の数値
orm | time | memory |
---|---|---|
eloquent | 69.567227363586 | 657.3546875 |
fuel | 22.457361221314 | 378.0078125 |
phalcon | 6.3767433166504 | 141.0859375 |
コメント
はい、本当に速かったです。このベンチマークでは、Phalcon ORMは実際、Eloquentの約10.9倍、FuelPHP 1.x ORMの約3.5倍速く、メモリ消費も少なかったです。
ソースコード
すべてのModelクラスでテーブルのフィールド名を全く記載していません。
ベンチマークとしてこのコードでいいのかやModelなどの記述方法が本当に正しいかに少し疑問があります。おかしいという点や別のORMを追加したい場合がありましたら、お気軽にPull Requestをお願いします。
まとめ
PhalconのORMは本当に速かったです。疑ってすみませんでした(w
Phalcon Advent Calendar 2014はまだ空きがあります。よかったら参加してみてください。
この記事はPhalcon Advent Calendar 2014の5日目です。明日はshun0102さんの「Phalconのloggerのメッセージフォーマットのカスタマイズ」です。
参考
Date: 2014/12/05