さらにPuxのルーティング性能をベンチマークしてみた
(2014-01-15 13:30 追記)
この記事のPuxのベンチマーク結果は、Cで書かれたPuxのPHP機能拡張が使われておらず、PHPで書かれたPuxの結果のようです。修正記事を後ほどアップします。
(2014-01-15 16:20 追記) PHP機能拡張が使われていないわけではないことがわかりました。後日、詳細な記事をアップします。
(2014-01-16 追記) 【完全版】Pux - A High Performance PHP Routerのルーティング性能をベンチマークしてみたをアップしました。
昨日のOrePhalconとOrePuxでPhalconとPuxのルーティングをベンチマークしてみたの続きです。
Puxについては、チューニングの余地がまだありました。
ベンチマーク環境
OS: Ubuntu 12.04
Apache: 2.4.7
PHP: 5.5.6 (32bit)
Phalcon: 1.2.5
Pux: 1.1.2 (C extension), GitHub master f42393f9d174872b48884363acb1344355aa43da (Tue Jan 14 02:22:26 2014 +0800)
OrePux Basic版
OrePhalconをPuxに移植したOrePuxです(昨日の記事と同じ)。
index.php:
<?php
ini_set('display_errors', 1);
error_reporting(-1);
require __DIR__ . '/../vendor/autoload.php';
$mux = new \Pux\Mux();
$mux->get('/hello/:name', ['hello','say']);
$route = $mux->dispatch($_SERVER['PATH_INFO']);
$controller = ucfirst($route[2][0]);
$action = $route[2][1];
$params = $route[3]['vars'];
try {
$controllerFilePath = __DIR__ . '/../app/controllers/' . $controller . ".php";
if (! file_exists($controllerFilePath)) {
throw new Exception("controller file is not found");
}
require $controllerFilePath;
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
echo $controller::$action($params);
.htaccess:
AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
Hello controller
Helloコントローラを用意します(昨日の記事と同じ)。
../app/controllers/Hello.php:
<?php
class Hello
{
public static function say($params)
{
return "Hello " . $params['name'];
}
}
OrePux Compiled Mux版
Puxは、ルーティング情報をコンパイルすることでさらに高速化が可能です。
まず、ルーティング情報をroutes.phpに記載します。
routes.php:
<?php
require __DIR__ . '/../vendor/autoload.php';
$mux = new \Pux\Mux();
$mux->get('/hello/:name', ['hello','say']);
return $mux;
routes.phpをpuxコマンドでコンパイルします。
$ curl -O -k https://raw.github.com/c9s/Pux/master/pux
$ chmod +x pux
$ ./pux compile -o mux.php routes.php
そして、OrePuxのindex.phpをコンパイルした情報を使うように変更します。
index.php:
<?php
ini_set('display_errors', 1);
error_reporting(-1);
require __DIR__ . '/../vendor/autoload.php';
$mux = require 'mux.php';
$route = $mux->dispatch($_SERVER['PATH_INFO']);
$controller = ucfirst($route[2][0]);
$action = $route[2][1];
$params = $route[3]['vars'];
try {
$controllerFilePath = __DIR__ . '/../app/controllers/' . $controller . ".php";
if (! file_exists($controllerFilePath)) {
throw new Exception("controller file is not found");
}
require $controllerFilePath;
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
echo $controller::$action($params);
ベンチマーク
ab -n 1000 http://localhost/OrePux/web/hello/xxx
のようにベンチマークしました。
Framework | Requests per second | Relative |
---|---|---|
OrePux Basic | 389.64 | 100% |
OrePux Compiled Mux | 477.80 | 123% |
Compiled Muxを使うことで、23%ほど高速化しました。
なお、$mux->get()
より$mux->add()
にした方が速いという情報ももらいましたが、手許の環境では差はわかりませんでした。
(2014-01-15 13:30 追記)
この記事のPuxのベンチマーク結果は、Cで書かれたPuxのPHP機能拡張が使われておらず、PHPで書かれたPuxの結果のようです。修正記事を後ほどアップします。
(2014-01-15 16:20 追記) PHP機能拡張が使われていないわけではないことがわかりました。後日、詳細な記事をアップします。
(2014-01-16 追記) 【完全版】Pux - A High Performance PHP Routerのルーティング性能をベンチマークしてみたをアップしました。
参考
Date: 2014/01/15