- PVSM.RU - https://www.pvsm.ru -
В ряде Symfony-проектов у нас используется hstore [1]. Для тех, кто не в курсе, hstore — это PostgreSQL-модуль, позволяющий сохранять массивы значений в одном поле. Мы накидали отдельны DBAL-тип hstore
, а также тип поля hstore
для Doctrine ORM, для прозрачного работы с такого рода полями.
Оформлено все в Symfony-бандл IntaroHStoreBundle [2]. Но речь в целом не о бандле. Речь о том, как мы попробовали оптимизировать его с помощью Zephir [3].
Дело в том, что бандл использует HStoreParser [4], преобразующий строковые представления массивов значений, которые приходят из PostgreSQL, в PHP-объекты. И парсинг начинает выполняться значительное время, когда нам нужно вывести большое количество записей из БД, в которых есть поля hstore, и в каждом из полей хранятся десятки значений.
С похожей проблемой [5] в свое время столкнулись разработчики шаблонизатора Twig [6], когда у них проседала по времени одна очень часто используемая функция. Они решили проблему портированием в C-extension для PHP.
Мы решили тоже попробовать данный подход, но реализовали не на чистом C, а используя Zephir. На то, чтобы разобраться в синтаксисе Zephir, развернуть его и портировать класс HStoreParser
ушло объективно немного времени. Из больших преимуществ Zephir то, что реализация на нем достаточно сильно похожа на исходную PHP-реализацию. Для сравнения реализация на PHP [4] и на Zephir [7].
Для оценки профита и проверки идентичности поведения классов подготовили тестовый набор hstore-данных [8] и тест [9]. Прогон осуществлялся на машине 2 GHz Intel Core i7 с PHP 5.4.26.
Результаты прогона получились следующие:
Эти же результаты в виде графичков:
Кроме того Zephir-код можно еще улучшить, когда появятся некоторые ожидаемые возможности (передача параметров по ссылке, внутренние статические переменные класса, замыкания).
В сухом остатке. Zephir-реализация медленных участков кода эффективна при этом не требует сильного переписывания кода. В целом, даже по силам поддерживать PHP- и Zephir-реализации параллельно, чтобы проект работал как на чистом PHP, так и с C-extensions.
Автор: muxx
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/67366
Ссылки в тексте:
[1] hstore: http://www.postgresql.org/docs/current/static/hstore.html
[2] IntaroHStoreBundle: http://github.com/intaro/hstore-bundle
[3] Zephir: http://zephir-lang.com
[4] HStoreParser: https://github.com/intaro/hstore-bundle/blob/master/HStore/HStoreParser.php
[5] похожей проблемой: http://derickrethans.nl/twig-extension.html
[6] Twig: http://twig.sensiolabs.org
[7] на Zephir: https://github.com/intaro/hstore-bundle/blob/master/Resources/zephir/hstore/hstoreparser.zep
[8] тестовый набор hstore-данных: https://github.com/intaro/hstore-bundle/blob/master/Tests/Resources/strings.php
[9] тест: https://github.com/intaro/hstore-bundle/blob/master/Tests/HStore/HStoreParserSpeedTest.php
[10] Источник: http://habrahabr.ru/post/233151/
Нажмите здесь для печати.