Прискорення роботи Symfony-бандла за допомогою Zephir

    У ряді Symfony-проектів у нас використовується hstore . Для тих, хто не в курсі, hstore — це PostgreSQL-модуль, що дозволяє зберігати масиви значень в одному полі. Ми накидали окрем DBAL-тип
hstore
, а також тип поля
hstore
для Doctrine ORM, для прозорого роботи з такого роду полями.
 
Оформлено все в Symfony-бандл Intaro \ HStoreBundle . Але мова в цілому не про бандлів. Мова про те, як ми спробували оптимізувати його за допомогою Zephir .
 
Справа в тому, що бандл використовує HStoreParser , що перетворить рядкові подання масивів значень, які приходять з PostgreSQL, в PHP-об'єкти. І парсинг починає виконуватися значний час, коли нам потрібно вивести велику кількість записів з БД, в яких є поля hstore, і в кожному з полів зберігаються десятки значень.
 
З схожою проблемою свого часу зіткнулися розробники шаблонизатор Twig , коли у них просідала за часом одна дуже часто використовувана функція. Вони вирішили проблему портированием в C-extension для PHP.
 
Ми вирішили теж спробувати даний підхід, але реалізували не так на чистому C, а використовуючи Zephir . На те, щоб розібратися в синтаксисі Zephir, розгорнути його і портировать клас
HStoreParser
пішло об'єктивно небагато часу. З великих переваг Zephir те, що реалізація на ньому досить сильно схожа на вихідну PHP-реалізацію. Для порівняння реалізація на PHP і на Zephir .
 
Для оцінки профита та перевірки ідентичності поведінки класів підготували тестовий набір hstore-даних і тест . Прогін здійснювався на машині 2 GHz Intel Core i7 з PHP 5.4.26.
 
Результати прогону вийшли наступні:
 
 
     
  • PHP HStoreParser: 1445.65677643 ms for 1000 strings
  •  
  • Zephir HStoreParser: 433.438062668 ms for 1000 strings
  •  
Ці ж результати у вигляді графічков:
 
 
 
Крім того Zephir-код можна ще поліпшити, коли з'являться деякі очікувані можливості (передача параметрів по посиланню, внутрішні статичні змінні класу, замикання).
 
У сухому залишку. Zephir-реалізація повільних ділянок коду ефективна при цьому не вимагає сильного переписування коду. В цілому, навіть під силу підтримувати PHP- і Zephir-реалізації паралельно, щоб проект працював як на чистому PHP, так і з C-extensions.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.