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のメッセージフォーマットのカスタマイズ」です。

参考

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

herokuでPHPをMac OS Xから使う

Mac OS Xからherokuを使えるように設定します。

必要なものは、以下の3つです。

  • Herokuのアカウント
  • PHP
  • Composer

アカウントにはSSH公開鍵も登録しておきます。

Heroku Toolbeltのインストール

「Download Heroku Toolbelt for Mac OS X」を押してHeroku Toolbeltをダウンロードしてインストールします。

ログイン

herokuコマンドでログインします。

$ heroku login

サンプルコードの取得

サンプルのコードをgitで取得します。

$ git clone https://github.com/heroku/php-getting-started.git

appの作成

herokuにappを作成します。

$ cd php-getting-started
$ heroku create
Creating immense-escarpment-4961... done, stack is cedar-14
https://immense-escarpment-4961.herokuapp.com/ | https://git.heroku.com/immense-escarpment-4961.git
Git remote heroku added

appのデプロイ

herokuにソースをpushします。

$ git push heroku master
Counting objects: 103, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (51/51), done.
Writing objects: 100% (103/103), 17.37 KiB | 0 bytes/s, done.
Total 103 (delta 39), reused 103 (delta 39)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> PHP app detected
remote: -----> No runtime requirements in composer.json, defaulting to PHP 5.6.3.
remote: -----> Installing system packages...
remote:        - PHP 5.6.3
remote:        - Apache 2.4.10
remote:        - Nginx 1.6.0
remote: -----> Installing PHP extensions...
remote:        - zend-opcache (automatic; bundled, using 'ext-zend-opcache.ini')
remote: -----> Installing dependencies...
remote:        Composer version 1.0-dev (37ec0bde9dd6826591308e7a1ad55cb5e38ef117) 2014-12-03 15:33:35
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:          - Installing psr/log (1.0.0)
remote:            Downloading: 100%
remote:        
remote:          - Installing monolog/monolog (1.11.0)
remote:            Downloading: 100%
remote:        
remote:          - Installing symfony/routing (v2.5.5)
remote:            Downloading: 100%
remote:        
remote:          - Installing symfony/http-foundation (v2.5.5)
remote:            Downloading: 100%
remote:        
remote:          - Installing symfony/event-dispatcher (v2.5.5)
remote:            Downloading: 100%
remote:        
remote:          - Installing symfony/debug (v2.5.5)
remote:            Downloading: 100%
remote:        
remote:          - Installing symfony/http-kernel (v2.5.5)
remote:            Downloading: 100%
remote:        
remote:          - Installing pimple/pimple (v1.1.1)
remote:            Downloading: connection...    Failed to download pimple/pimple from dist: The "https://api.github.com/repos/fabpot/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d" file could not be downloaded (HTTP/1.1 404 Not Found)
remote:            Now trying to download from source
remote:          - Installing pimple/pimple (v1.1.1)
remote:            Cloning 2019c145fe393923f3441b23f29bbdfaa5c58c4d
remote:        
remote:          - Installing silex/silex (v1.2.2)
remote:            Downloading: 100%
remote:        
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote: 
remote: -----> Compressing... done, 72.2MB
remote: -----> Launching... done, v3
remote:        https://immense-escarpment-4961.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/immense-escarpment-4961.git
 * [new branch]      master -> master

webプロセスが1つあることを確かめます。

$ heroku ps:scale web=1

appへのアクセス

ブラウザで作成したappのページを開きます。

$ heroku open

ログを見る

$ heroku logs --tail
2014-12-04T13:05:13.653066+00:00 heroku[router]: at=info method=GET path="/" host=immense-escarpment-4961.herokuapp.com request_id=0162ab92-cd24-4cb5-aae0-3000f9e4e668 fwd="211.1.214.70" dyno=web.1 connect=0ms service=9ms status=200 bytes=238
2014-12-04T13:05:13.648651+00:00 app[web.1]: [2014-12-04 13:05:13] myapp.INFO: Matched route "GET_" (parameters: "_controller": "{}", "_route": "GET_") [] []
2014-12-04T13:05:13.651095+00:00 app[web.1]: [2014-12-04 13:05:13] myapp.DEBUG: logging output. [] []
2014-12-04T13:05:13.653104+00:00 app[web.1]: 10.68.82.78 - - [04/Dec/2014:13:05:13 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0"
2014-12-04T13:05:13.649443+00:00 app[web.1]: [2014-12-04 13:05:13] myapp.INFO: > GET / [] []
2014-12-04T13:05:13.652025+00:00 app[web.1]: [2014-12-04 13:05:13] myapp.INFO: < 200 [] []

[control]+[C]で表示を終了します。

Tags: heroku, php, mac

Web IDEのNitrousでPHPを試してみる

昨日、達人出版会の高橋さんがWeb IDEのNitrous.IOを使っていましたので、私も試してみました。NitrousではRuby以外にもPHPも使えます。

上記のリンクから登録すると、N2O(Nitrousでのポイント?)が10単位増えるようです。「Sigh Up for Free」ボタンを押して登録します。確認のメールが届くのでURLをクリックすると登録完了です。

▼Nitrousにログインしたところ Nitrousにログインしたところ 「Open Dashborad」ボタンを押します。

▼Box(仮想マシン?)を作成します。 Boxの作成 「PHP」を押して、「East Asia」を選択しました。

▼N2Oを取得する方法の説明ですが、そのまま進みます。 Get More N2O

▼エディタについての説明ですが、これもそのまま進みます。 Use Any Editor

▼IDEが起動しました。 IDEが起動 左コラムで右クリックして、「New File」を選択しファイルを作成してみましょう。

▼index.phpファイルを作成しました。 index.phpファイルを作成 「Preview」メニューから「Port 3000」を選択します。

▼新しいページが開き、作成したindex.phpにアクセスできました。 phpinfo()ページ

IDEの「Box」メニューを押して、Boxのページに移動し、このBoxの「Shutdown」ボタンを押し、さらに「Terminate」ボタンを押すと、このBoxを破棄できます。

無料では1つのBoxしか使えないようなので、一旦、このBoxを破棄します。

▼新たにBoxを作ります。 Boxの新規作成 今度は「Download GitHub repo」にCodeIgniterのリポジトリを指定してみました。

▼Box作成中です。 Box作成中

▼IDEが起動しました。CodeIgniterがインストールされています。 CodeIgnirerのソース

▼CodeIgniterにブラウザからアクセスできるようにApacheのDocumentRootを変更します。 httpd.confの変更

▼変更した設定を有効にするためApacheを再起動します。partsというコマンドを使います。 Apacheの再起動

▼Previewすると、CodeIgniterのWelcomeページが表示されました。 CodeIgniterのWelcomeページ

関連

Tags: php, ide, codeigniter