2014年2月24日月曜日

最近気になるPHPフレームワークHelloWord性能比較大会

最近気になっているPHPフレームワークのベンチマークを取得してみました。
サーバやフレームワークなどのチューニングはほとんどしていないので、
結果は、あくまで参考程度としてください。

テスト環境

仮想環境 (1CPU memory 4GB)
PHP 5.5.9 (opcache使用)
NGINX 1.4.5

確認したコマンド※

ab -n 1000 -c 20 http://localhost.local/
※外部からではなく同じサーバで実施しています。

結果


Phalcon 1.2.6


Time taken for tests: 0.523 seconds
Requests per second: 1910.87 [#/sec]

FuelPHP 1.7


Time taken for tests: 1.704 seconds
Requests per second: 586.90 [#/sec]

Laravel 4.1


Time taken for tests: 6.171 seconds
Requests per second: 162.04 [#/sec]

php artisan optimizeで最適化
Time taken for tests: 4.925 seconds
Requests per second: 203.02 [#/sec]

Ruby on Rails 4.0.3 (特別ゲスト)


Time taken for tests: 2.851 seconds
Requests per second: 350.73 [#/sec]

Ruby On Rails4も含めてみました。
環境はPHPとは異なり次のとおりです。
NGINX 1.4.4
Passenger4.0.37
ruby 2.1.0

感想


Phalconが圧倒的な処理速度で1位です。
Laravelと比較すると約11倍以上速いですね。
FuelPHPはLaravel寄りではありますが、まずまずの性能です。

artisanコマンドで最適化されたLaravelでもそれほど大幅には変化がなかった(でもLaravel比だと25%アップ)ので、速度が出ないのは、autoloadが原因ということはなさそうです。
LaravelはIoC Containerというのが得意で、コードがきれいで書きやすいのですが、
それが原因かどうかはわかりませんがパフォーマンス面では他に劣るようです。
今のところPHPでもRailsと同様にパフォーマンスと便利な機能は相反するようですね。
またPhalconが速いのはC言語で実装されたフレームワークの部分だけなのでPHP部分はそんなに変わらないのではないかと思います。
結果はPhalconが目立ちすぎてますが、実際のロジックを実装した状態ではそこまでは差がないのではないかと考えています。
また、PhalconはC言語で実装されているので運用面でトラブルの際の調査も難しくなりそうで、
仕事に使うのはZephirで実装されるバージョン2.0までは様子をみようかと思っています。
Zephirは今後どうなるか気になるところです。
LaravelがZephirで実装されたりとか・・・、今のところその動きはなさそうですが。

Railsは、言語違いますがフルスタックのフレームワークの代表例として参考になるかと思って追加しました。
LaravelとFuelPHPの中間くらいで以前より速くなってますね。
RubyのVMが進化していたり、Rails自体もチューニングが進んでいるのかも。

いずれにせよ、現実的ではないHelloWorld程度の比較なので、
あまりこの結果を鵜呑みにしないようにご注意ください。



2014年2月3日月曜日

Python3.3.3でdistributeインストール中のエラー

ランチ食べ過ぎて若干苦しい昼下がり、
Python3.3.3環境を作ってみたところ、distributeのインストールでこけましたとさ。 環境は、VagrantのCentOS6.5環境
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py

Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
Traceback (most recent call last):
  File "distribute_setup.py", line 556, in 
    sys.exit(main())
  File "distribute_setup.py", line 552, in main
    tarball = download_setuptools(download_base=options.download_base)
  File "distribute_setup.py", line 211, in download_setuptools
    src = urlopen(url)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 475, in open
    response = meth(req, response)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 587, in http_response
    'http', request, response, code, msg, hdrs)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 507, in error
    result = self._call_chain(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 692, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 469, in open
    response = self._open(req, data)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 492, in _open
    'unknown_open', req)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 1310, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: 

stackoverflow先生によるとopenssl-develが必要らしい
http://stackoverflow.com/questions/18833442/installing-distribute-for-python-3-3
しかも、openssl-develインストール済みの状態でpyothon3をビルドしないとダメっぽい。

openssl-develを忘るべからず

yum install openssl-devel.x86_64
pythonz uninstall 3.3.3
pythonz install 3.3.3
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py
ちなみにpythonzで入れた3.3.3のpythonのシンボリックリンクがpython3-configに向いてるんですが・・・・
びっくりした・・・。ので、リンク張り直した。
python -> ~/.pythonz/pythons/CPython-3.3.3/bin/python3.3-config

rm -f ~/.pythonz/pythons/CPython-3.3.3/bin/python
ln -s ~/.pythonz/pythons/CPython-3.3.3/bin/python3.3 ~/.pythonz/pythons/CPython-3.3.3/bin/python

stackoverflow先生今日もありがとう!