Pull to refresh

Так ли быстр ваш Framework или хватит тестировать производительность Нello World

Reading time3 min
Views9.9K
На примере быстрейших фреймворков «Phalcon» и «handmade».
Обгоняем Phalcon без компиляции исходных кодов.




Почему именно Phalcon? Это довольно свежее и многообещающее решение в плане производительности, хотя на его месте может быть любой фреймворк (это станет ясно из статьи).

Для тестирования использован phalcon 1.2.0beta1 64Bit для OpenSuse
Из дополнительных подключенных библиотек PHP 5.3 была только php5-APC, для чистоты эксперимента.

Руководствуясь мануалом создаем приложение Phaclon
index.php
<?php
try {
    //Register an autoloader
    $loader = new \Phalcon\Loader();
    $loader->registerDirs(array(
        './app/controllers/',
        './app/models/'
    ))->register();

    //Create a DI
    $di = new Phalcon\DI\FactoryDefault();

    //Setting up the view component
    $di->set('view', function(){
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('./app/views/');
        return $view;
    });

    //Handle the request
    $application = new \Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();

} catch(\Phalcon\Exception $e) {
     echo "PhalconException: ", $e->getMessage();
}

./app/controllers/IndexController.php
<?php
class IndexController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {
        echo "<h1>Hello!</h1>";
    }
}


Запускаем, работает, memory_get_usage() говорит, что использовано 692kb памяти, отличный результат.
Apache Benchmark выдает 8707 rps:


Изумительно, потрясающая производительность.

Заглядываем в xdebug profile, оптимизм проходит, и многое становится ясно. Что это приложение сделало такого особенного? Это просто echo. Ничего не имею против Phalcon, но как быть с более сложными задачами?

Можно ли сделать PHP-фреймворк, который будет быстрее Phalcon, без необходимости компиляции исходных кодов? Не вопрос, сейчас сделаем. А потом еще и докажем тестами, что он быстрее.

Создаем конкурента, назовем его Handmade
index.php:
<?php
require_once './Autoloader.php';

$autoloader = new Autoloader(array(
	'paths'=>array(
			'./app',
			'./lib'
	)		
)); 

$app = new Application();
$app->run();

Autoloader.php
Автозагрузчик решил взять из своего проекта, сэкономил время.
Исходный код тут, ничего особо навороченного, обычная PSR-0 совместимая автозагрузка.

./lib/Application.php
<?php
class Application
{
	public function run()
	{
		$uri = $_SERVER['REQUEST_URI'];
		
		$paths = explode('/' , $uri);
		
		if(isset($paths[0]) && !empty($paths[0])){
			$controller = ucfirst(strtolower($paths[0])).'_Controller';
		}else{
			$controller = 'Index_Controller';
		}
		
		if(isset($paths[1]) && !empty($paths[1])){
			$action = strtolower($paths[1]).'Action';
		}else{
			$action = 'indexAction';
		}
		
		$controller = new $controller;
		$controller->$action();
    }
} 

app/Index/Controller.php
<?php
class IndexController extends Controller
{
    public function indexAction()
    {
        echo "<h1>Hello!</h1>";
    }
}


Запускаем, работает, memory_get_usage() говорит, что использовано 624kb памяти. Отличный результат!

Apache Benchmark выдает 11793 rps:


Вуаля 11793 против 8707 rps, оказалось не так сложно, 15 минут программирования, без оптимизаций.
Осталось построить красивые графики и поместить их ближе к заголовку статьи.

Наверное, возникнет вопрос, с чего это вдруг я решил что, можно сравнивать его любимый framework «вставить название» со своей халтурной поделкой у которой и функционала то нет особо никакого. Загляните в интернет, полно тестов платформ несравнимых по целям и функционалу.

В этом вся суть топика, давайте взглянем на полезную нагрузку двух сравниваемых решений. Откроем profile, который нам предоставляет xdebug. Для визуализации буду использовать kcachegrind.

Что мы видим:
Phalcon Handmade



Оба решения выполняют практически одинаковую нулевую работу.

К чему все это.

Как разработчик я часто присматриваюсь к различным решениями, немаловажную роль для меня играет производительность используемой платформы. Но, к сожалению, открыв очередной framework я не могу понять его реальной производительности, разработчики предоставляют тест Hello World, который совершенно ни о чем не говорит. Сложно сориентироваться, остается выяснять реальную производительность той или иной платформы основываясь на личном опыте и понимании того, что очевидно тормозит систему.
Такие индикаторы как:
  • большое количество «магии»
  • излишняя абстракция и избыточная функциональность
  • повсеместное использование DI Container
  • архитектура, основанная на событийной модели (не путать с Event-driven PHP)

Приходится выбирать сбалансированное решение по удобству, функциональности и производительности. Последнее, на мой взгляд, самое легкое для оптимизации место.

Мораль

Не стоит обращать внимания на популистские лозунги и красивую рекламу, тренды. Изучайте как можно больше решений, берите из них лучшее, совмещайте удачные реализации. Не пишите и не читайте тесты Hello World это пустая трата времени. Выбирайте инструмент, заточенный под решение вашей конкретной задачи.
Tags:
Hubs:
+10
Comments11

Articles