Phalconの何がいいのか速いのかに疑問を持ってみる

#Phalconの何が速いのか
だいぶ遅れてしまいました。申し訳ございません！
[前回](http://qiita.com/bitoCoffee/items/5699d0af5334d455e698)はありがとうございました。
今回はPhalconが何が速いのかそれはどのように速いのか、公開されているベンチマークなどを観察しました。
はじめに、私は、Phalconは速いと言われているが、処理だけで見るとオバーヘッドも決して少ないわけじゃなく、多言語たとえばC++,Go,JavaやScala、Rubyよりも遅く耐久性や運用のしやすさで劣るかもしれないと考えました。では何が本当にそんなに速いといわれているのかをみるために実験などを行いました。


1. 自作のスクリプト（大量のテキストファイルと大量のDB処理でのベンチマーク）
2. [【公式 Hello World ベンチマーク】](http://docs.phalconphp.com/ja/latest/reference/benchmark/hello-world.html) から確認する
3. [Web Framework Benchmarks](http://www.techempower.com/benchmarks/) から確認する ※多言語とも比較されている

##自作のスクリプト（大量のテキストファイルと大量のDB処理でのベンチマーク）
大量のテキストファイルと大量のSQL処理がある中で違いが現れるかベンチをとってみました。
2,034,261件分のログとSELECT 476,210件のINSERT処理が走るものです。

###結果 (SELECTのみ)
Phalcon 140秒
Codeginiter 130秒

###結果（INSERTも伴う）
Phalcon 420秒
Codeigniter 400秒

###結果から考えること
大量の処理を行うbatchのようなSQL処理が勝敗を分けるようです。
約200万件の処理を伴うためわずかなSQLとのやり取りの時のロスが積み重なることです。

####作業を行っていて気づいた点等や感想
Phalcon からDBとのやり取り時に結構躓きました。
INSERTを行った後、次にINSERTを行いたい場合はModel オブジェクトをnew で新しくすることでした。そうしないと、同じ位置の行のデーターが更新されるだけです。
Codeigniterの方が素直にかけたり、DBとのやり取りも普段通り気にせず使えるので何か大量にバッチ処理させたいぜでもPHPしかわからないし、シェルでやるとめっちゃ複雑になってわけわからないから管理しにくいのであれば、Codeigniterで構造化してプログラミングしたほうがグッと見やすく安全に組めるはずです。

####その他エラー
* Syntax error, unexpected token IDENTIFIER(EXISTS)

Phalcon PHQLはCASEが使えないそうです。。
[How to use Order By CASE WHEN THEN ... in PHQL](http://forum.phalconphp.com/discussion/3219/how-to-use-order-by-case-when-then-in-phql)

なので生SQLを[Phalcon\Mvc\Model\Resultset\Simple](http://docs.phalconphp.com/ja/latest/api/Phalcon_Mvc_Model_Resultset_Simple.html) にて行う必要がありました。

* PHQL statement cannot be NULL

データー構造上 NULLが大丈夫でも Phalcon側ではじかれることがありました。 

##Web Framework Benchmarks
WEBフレームワークに興味がある皆さんがGoogle Groupで作られているベンチマークの結果をまとめているサイトです。
様々な言語の総合的なベンチマークを行っているようです。

PHPに関しては だいぶ健闘しているように見えますがやはりGoやC++,Java等、事前に最適化されてCompileされているフレームワークにはなかなか勝てないようです。

```text:PHP

PHP with APC, PHP-FPM, nginx
PHP ActiveRecord
Cake
Code Igniter
FuelPHP
Kohana
Laravel
Lithium
Micromvc
Phalcon
PHPixie
Phreeze
Senthot
Silex
Slim
Symfony
Yaf
```

php に Opcacheがもしかしたら通っていないかもしれないし詳細な情報がわかりませんが、
php5.4 あたりを使っているかもしれないので 次の [PHP-NG](https://wiki.php.net/phpng) が出た際にはPHP史を塗り替える事態になって欲しいという希望があります。
*PHP-NG
PHPにJITコンパイラを導入を検討しようとPHPのコンパイル時の品質を高め、さらに高速化を図った結果2014年1月2日時点から2014年11月21日時点の間に200%の高速化をしているようです。
[PHPNG (next generation) - Performance Evaluation](https://wiki.php.net/phpng)

 
##公式 Hello World ベンチマーク
Phalcon プロジェクトが公式としてサイトの一番トップに表示されています。
確かに見てみるとPhalconの優位のように思います。
###環境

> * Operating System: Mac OS X Lion 10.7.4
* Web Server: Apache httpd 2.2.22
* PHP: 5.3.15
* CPU: 2.04 Ghz Intel Core i5
* Main Memory: 4GB 1333 MHz DDR3
* Hard Drive: 500GB SATA Disk


###ベンチマーク項目
> * Requests per second
* Time across all concurrent requests
* Number of included PHP files on a single request (measured using function get_included_files.
* Memory Usage per request (measured using function memory_get_usage.

いずれもApachのベンチマークツールでローカルからのアクセスみたいです。

```shell-session:2000回のリクエストを行い、同時接続数は10
ab -n 2000 -c 10
```

より 2000回のリクエストを行い、同時接続数は10のようです。

2012年時点だし！これでいいのかということでフレームワークさんたちを更新して測ってみましょう

###再ベンチマーク環境

期待感をこめて最新な環境をキャッチアップして構築してみましょう。
Vagrant Box 
https://vagrantcloud.com/ubuntu/boxes/trusty64

ベンチマークは [phalcon/framework-bench(github)](https://github.com/phalcon/framework-bench)

* Ubuntu 14.04.1 (trusty64)
* Apache 2.4.7
* Phalcon 1.3.4
* PHP 5.5.9 (Ubuntu)

他、
* Memory :: 4G
* CPU :: Intel(R) Core(TM) i7-2600S CPU @ 2.80GHz


###使用するPHPフレームワーク
（2014-12-17現在）
[Yii](http://www.yiiframework.com) (YII_DEBUG=false) (2.0.1)
[Symfony](http://symfony.com) (2.6)
[Zend Framework](http://framework.zend.com) (2.3.3)
[FuelPHP](http://fuelphp.com) (1.7.2)
[CakePHP](http://cakephp.org) (2.5.7)
[Laravel](http://laravel.com) (4.2)
[CodeIgniter](http://www.codeigniter.com) (2.2)
[おまけ Lisp woo](https://github.com/fukamachi/woo)

###再ベンチマーク ベンチマーク項目
* Requests per second
* Time across all concurrent requests
* Transfer rate

```shell-session:10000回のリクエストを行い、同時接続数は150
ab -n 10000 -c 150
```


```shell-session:CakePHP

Requests per second:    27.50 [#/sec] (mean)
Time per request:       36.367 [ms] (mean, across all concurrent requests)
```

```shell-session:Yii
Requests per second:    29.16 [#/sec] (mean)
Time per request:       34.290 [ms] (mean, across all concurrent requests)
```

```shell-session:Symfony
Requests per second:    32.06 [#/sec] (mean)
Time per request:       31.192 [ms] (mean, across all concurrent requests)
```

```shell-session:ZendFramework
Requests per second:    63.89 [#/sec] (mean)
Time per request:       15.653 [ms] (mean, across all concurrent requests)
```

```shell-session:Larabel
Requests per second:    106.51 [#/sec] (mean)
Time per request:       9.389 [ms] (mean, across all concurrent requests)
```

```shell-session:Fuel
Requests per second:    210.25 [#/sec] (mean)
Time per request:       4.756 [ms] (mean, across all concurrent requests)
```

```shell-session:Codeigniter
Requests per second:    693.83 [#/sec] (mean)
Time per request:       1.441 [ms] (mean, across all concurrent requests)
```

```shell-session:Phalcon
Requests per second:    1034.27 [#/sec] (mean)
Time per request:       0.967 [ms] (mean, across all concurrent requests)
```

```shell-session:Apache
Requests per second:    2377.23 [#/sec] (mean)
Time per request:       0.421 [ms] (mean, across all concurrent requests)
```

```shell-session:(おまけ)
Requests per second:    2904.98 [#/sec] (mean)
Time per request:       0.344 [ms] (mean, across all concurrent requests)
```

###結果
PhalconはよくできたPHP Framework中では最速で動きます！！よかった！（ｗ）
結果に関しては各個人でも実際に観測することが望まれます。

##感想
長くなりましたがありがとうございました。

結果としてはPhalconめっちゃ速いです。
生PHPでオレオレフレームワーク書くよりは遥かに良いです。

Phalconは僕の経験してきた言語の中ではJava(Servlet,Androidアプリで)やObjective-C(iPhoneアプリで)っぽいな。さすがフルスタックフレームワークという感じです。Coreな処理はインストールしたら毎回ソースとして用意しなくてよいから、処理設計を明確にした上で構造を最適化を行いプログラミングを行えば自然に生PHPで書いたり他のフレームワークで書けば、より堅くて高速なアプリケーションが手に入るといえそうです。
まさにPHPで実装したWEB Application FrameWorkと言えそうです。
実際にフレームワークをたくさん触ったのは実は初めてなことで構造や実行をさせることができてとてもよかったです。
最近はPHP composerを使ったFrameWorkが主流なんですね。
導入部分から積極的に使っているFrameWorkもありますがあるべき姿として正しいのかと言われると不思議な感じがします。
大規模プログラミングであった場合バージョン管理がcomposer.jsonだけで済むのはありがたそうです。

フレームワークや言語はよく自分の目で確かめてから利用し、それをいつでも計測できるようにしておくことに越したことはないと思いました。ここは自分はPHPが得意だからと計測したりメリットやデメリットを考えないのはもったいないので、考えて組むべきだと思います。
もちろん初心者であればどんな言語でも誰かのサポートがある言語の方が早く覚えられると思います。

Phalconの次のバージョンPhalcon2 や PHP-NGに期待が膨らみます。

皆さんもPhalconを触ってみてください。

それでは！よいお年を！