OrePhalconとOrePuxでPhalconと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のルーティング性能をベンチマークしてみたをアップしました。

GitHubにPuxというPHPのルータがありました。

Pux is 48.5x faster than symfony router in static route dispatching, 31x faster in regular expression dispatching. (with pux extension installed)

ということで、symfony routerより静的なルーティングで48.5倍、正規表現のルーティングでも31倍速い(pux機能拡張をインストールした場合)とのことです。

ということで、brtRiverさんのOrePhalconを参考にベンチマークしてみました。

ベンチマーク環境

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)

OrePhalcon

まず、OrePhalconをPhalcon 1.2.5で動作するように移植します。

index.php:

<?php

ini_set('display_errors', 1);
error_reporting(-1);

$router = new \Phalcon\Mvc\Router();
$router->add("/hello/:action", array(
    "controller" => "hello",
    "action"     => "say",
    "name"       => 1,
));
$router->handle();

$controller = ucfirst($router->getControllerName());
$action     = $router->getActionName();
$params     = $router->getParams();

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?_url=/$1 [QSA,L]
</IfModule>

OrePux

次に、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'];
    }
}

Phalcon Routing vs Pux Routing

ab -n 1000 http://localhost/OrePhalcon/web/hello/xxxのようにベンチマークしてみました。

Framework Requests per second Relative
OrePhalcon 808.64 220%
OrePux 367.21 100%

Phalconの圧勝でした。Phalconほんと速いですね。

(2014/01/15 07:07追記) さらに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のルーティング性能をベンチマークしてみたをアップしました。

参考

Date: 2014/01/14

Tags: php, phalcon, pux, benchmark