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

この環境は、「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テーブルのレコードとコメントを取得して、posttitleと最新のcommentbodyを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

Tags: php, orm, phalcon, fuelphp, laravel, benchmark