Сравнение шаблонизаторов MODX, Fenom и Smarty



В очередной раз прочитав утверждение, что Fenom быстрее стандартного парсера, решил провести указанный в документации pdoTools тест, чтобы расставить все точки над и. Но решил сделать это не отдельными скриптами, как в документации, а практичнее — через сниппет, который будет вызыватся на странице. Плюс добавил для сравнения шаблонизатор Smarty из ZoomX. Так вот, у меня таки есть шо вам сказать.

Как я уже много раз говорил, тест в документации искусстввенный. Редко кто будет выполнять запросы в отдельных скриптах. Да и вряд ли кто может привести пример проекта из своего опыта, где выводятся тысячи ресурсов странице. Даже 100 ресурсов — это большая редкость. Обычно используют пагинацию и выводят по 10-20 одинаковых блоков. Поэтому я не стал замерять парсинг тысячи чанков, а использовал более реальные цифры — 10 и 100. Чанки взял с логикой.

Вывод 10 ресурсов


  • Шаблонизатор MODX — 0,05 сек.
  • Шаблонизатор Fenom — 0,06 сек.
  • Шаблонизатор Smarty — 0,06 сек.
Считал среднее из 10 запросов. Делал несколько замеров по 10 запросов. Иногда Smarty был чуть быстрее Fenom. Иногда наоборот. В общем, это в рамках погрешности. PHP шаблонизаторы работают одинаково — оверхед из-за накладных расходов на инициализацию и компиляцию шаблонов. Но потенциально у Smarty в рабочих проектах будет преимущество перед Fenom из-за специфики интеграции последнего. Он используется шаблонизатором MODX для многократного парсинга. А Smarty парсит страницу только один раз.
Итог: MODX парсит чанки чуть быстрее. Это указано и в исходном тесте.

Вывод 100 ресурсов


  • Шаблонизатор MODX — 0,18 сек.
  • Шаблонизатор Fenom — 0,18 сек.
  • Шаблонизатор Smarty — 0,18 сек.
Как видим, все шаблонизаторы идут в ровень.

Ну давайте уж и для тысячи посмотрим.

Вывод 1000 ресурсов


  • Шаблонизатор MODX — 1,31 сек.
  • Шаблонизатор Fenom — 1,3 сек.
  • Шаблонизатор Smarty — 1,3 сек.
Даже на тысяче ресуров не видно преимуществ PHP шаблонизаторов. Единственное, что хочу отметить — Fenom использовал 3МБ памяти, а Smarty 2МБ. Но это мелочи.

Так что предлагаю не заблуждаться и не путать других. PHP шаблонизаторы не дают значительного прироста скорости. Их преимущество будет заметно при сложной логике. А вот функциональность их значительно превосходит парсер MODX. Он никогда не сможет реализовать подобное.

В качестве вывода могу дать совет. Там, где не нужна логика, используйте синтаксис MODX. Если работаете с логикой, то не путайте синтаксисы — используйте только один.

П.С. Чтобы внести больше ясности хочу отметить, что разговор идёт о среднестатистических сайтах с установленной библиотекой pdoTools.
Сергей Шлоков
23 апреля 2022, 10:52
modx.pro
2 434
+16
Поблагодарить автора Отправить деньги

Комментарии: 20

Klike
23 апреля 2022, 11:08
0
Спасибо за статью! Подскажите, когда ожидать ZoomX для MODX3?)
    Сергей Шлоков
    24 апреля 2022, 10:11
    +1
    Точных сроков дать не могу. Как появится свободное время.
    Misha Bulic
    23 апреля 2022, 11:54
    0
    Вопрос: как отловить параллельное использование modx синтаксиса и fenom например. Чанков много вызывается и возможно где то упустил что-то. Плюс интересно посмотреть как упадут результаты при параллельном вызове.
      Сергей Шлоков
      24 апреля 2022, 10:12
      0
      Наверно поиском [[$ по таблицам контента, шаблонов и чанков. Или заюзать событие OnParse.
      Алексей Смирнов
      23 апреля 2022, 12:14
      0
      Добавлю свои 5 копеек в подтверждение по работе fenom vs MODX парсер, раз уж речь про скорость. В телеграм канале постоянно спрашивали об этом тоже.
      Я пару лет назад сам переходил на fenom с синтаксиса MODX и сделал 2 шаблона главной страницы — один был на феноме другой на MODX тегах. Причем там и pdoToolse и migx был.
      Разница в пользу MODX парсера была 0,01...0,03 сек. как с кешем так и без.
      Чуть подробнее t.me/ru_modx/367774
        Сергей Шлоков
        24 апреля 2022, 10:20
        0
        Прочитал про размер кэша. Твоё удивление от непонимания. Что такое кэш? Это статичные данные. Если у тебя кэш на феноме в 10 раз меньше, то есть повод задуматься — всё ли закэшировалось? Отсюда и лишние запросы к БД. Конструкция {include 'чанк'} никогда не кэширует чанк.

        Просто с таким же успехом можно восхищаться пустой папкой кэша после того, как ты его отключишь.
          Алексей Смирнов
          24 апреля 2022, 10:29
          0
          Сергей, я как раз понимаю что раз кеш уменьшился значит меньше данных попало в кеш. Но от этого принципиально скорость не уменьшилась или увеличилась.
          Вот о чем речь. и да там лишние 10 запросов. но в моем случае — не страшно было.
            Сергей Шлоков
            24 апреля 2022, 11:32
            0
            Вспомнился роман Хейли «Колесо». Там создавали новую модель машины и на этапе тестирования возникла проблема — что-то с коробкой передач на определённой скорости. Стоимость доработки 5 долларов. Ерунда. Копейки по сравнению со стоимостью машины. Но разработчики отказались от этой идеи. Причина — планировалось выпустить около 1 миллиона экземпляров. А значит дополнительный расходы составили бы + 5 млн. долларов.

            10 лишних запросов для небольшого сайта — плёвое дело. А для высоконагруженного может оказаться непозволительной роскошью.

            Подход к кэшированию должен быть вдумчивым. Кэшировать всё подряд также не имеет смысла. Нужно думать об актуализации данных. Поэтому всегда нужно находить баланс. Для этого и нужны опытные разработчики. )
        Василий Наумкин
        24 апреля 2022, 11:18
        0
        Вот в этой заметке сейчас 890 комментариев и она выводится плюс-минус за 1 секунду на Fenom с разными условиями.

        Выводится без кэша, потому что комментарии отличаются для каждого юзера. Админу выводятся удалённые, автору подсвечиваются его ответы и т.д.

        Попробуйте это повторить на парсере MODX. Не думаю, что вывод комментариев на сайте это прям такая уж редкая задача.
          Сергей Шлоков
          24 апреля 2022, 11:24
          0
          Читаем внимательно и до конца.
            Василий Наумкин
            24 апреля 2022, 11:28
            0
            Даже 100 ресурсов — это большая редкость.
            Я тебе привожу пример, что нет — не редкость.

            Как справится парсер MODX с выводом такой ветки комментариев, если он каждый тэг и условие будет превращать в modTag и запускать его parse?

            PHP шаблонизатор всё еще только про удобство, а не скорость?
              Сергей Шлоков
              24 апреля 2022, 11:55
              0
              Замечание принял. А кроме комментариев есть ещё примеры?

              Или это только про удобство, а не скорость?
              К самому тесту замечания есть? Я говорю про тест через сниппет в обычном режиме, в котором будут работать 99,9% разработчиков, а не через API.

              П.С. Лично я считаю, что эти тесты искуссвенные. В боевом проекте, где куча чанков, сниппетов и т.д., цифры будут совершенно другие. Вот где интересно было бы погонять тесты.Но судя по отзывам разработчиков, которые меняли синтаксис, разницы особо не видно. Даже часто феном немного проседал.
                Василий Наумкин
                24 апреля 2022, 12:24
                +8
                А кроме комментариев есть ещё примеры?
                pdoTools появился не на пустом месте, а потому что я делал разные сложные сайты, включая bezumkin.ru

                К самому тесту замечания есть?
                Ты даже кода чанков не привёл, тупо итоговые цифры и заявление, что разницы нет.

                Если ты эти тесты проводил на одном сайте, и парсер pdoTools был включен — то поздравляю, ты уже пользовался оптимизациями, потому что pdoParser разбирает простые плейсхолдеры сам, без modTag.

                Я прямо сейчас создал 2 сайта на modhost.pro. На один установил pdoTools, а на другой нет.

                Тестовый сниппет:
                <?php
                $items = [];
                for ($i = 1; $i < 10000; $i++) {
                  $data = ['id' => rand(), 'pagetitle' => 'page' . rand()];
                  $items[] = $modx->getChunk('test', $data);
                }
                
                $output = number_format(microtime(true) - $modx->startTime, 4) . "\n";
                $output .= number_format(memory_get_usage() / 1048576, 4) . "mb\n";
                $output .= implode("\n", $items);
                
                return $output;

                Простейший чанк:
                <p>[[+id]] - [[+pagetitle]] [[+id:is=`10`:then=`1`:else=``]]</p>
                Обрати внимание, что чанк без Fenom, чисто синтаксис MODX.

                Смотрим на 10000 проходов, чтобы разницу было хорошо видно:

                — MODX без pdoTools — 1.3216 сек (самый быстрый результат, что удалось увидеть)
                — MODX c установленным pdoTools — 0.0557 (самый тормозной результат, было и 0.0156).

                Внимание, pdoTools просто установлен, и работает по умолчанию. Никаких специальных оптимизаций.

                Теперь понятно, что парсер MODX без pdoTools просто тормозное говно и твои тесты ни о чём?



                Updated 26.04.2022
                Попробовал повторить тест еще раз и не смог — оказалось, что я допустил ошибку. Если сниппет использует $modx->getChunk(), то разницы в скорости не будет, потому что pdoParser тогда не работает.

                Сниппет должен использовать $modx->getService('pdoTools')->getChunk('test', $data);, тогда всё быстро.

                Всё проверил еще раз и накатал новую заметку с результатами.
          Сергей Шлоков
          25 апреля 2022, 21:25
          0
          Так, давайте проясним, чтобы не было недопонимания.
          В статье я показал, что если у вас установлен pdoTools, не надо бросаться переписывать все на Fenom и менять [[pdoResources? ...]] на {'pdoResources' | snippet: [...]}, или [[++setting]] на {'setting' | config} ради выигрыша в скорости как советуют некоторые разработчики. Вы его не получите.

          П.С. И, да, чанк я взял из теста (тот который с логикой), о чём и написал в начале поста.
            Павел Гвоздь
            26 апреля 2022, 07:35
            +4
            Сергей, я считаю вполне обоснованным «недопонимание» со стороны Василия, мне бы тоже не понравился упрёк в мою сторону:
            Но как же у автора pdoTools получились такие впечатляющие цифры? А всё просто. Тест проводился в API режиме. Т.е. в идеальных условиях для Fenom.
            И выше Василий показал, что не в АПИ режиме дело.

            В качестве вывода могу дать совет. Там, где не нужна логика, используйте синтаксис MODX. Если работаете с логикой, то не путайте синтаксисы — используйте только один.
            И в конце статьи тогда стоило бы уточнить про предустановку pdoTools, а то создаётся впечатление, что pdoTools с его Fenom не даёт преимуществ на шаблонах без логики.
              Сергей Шлоков
              26 апреля 2022, 22:23
              0
              Сергей, я считаю вполне обоснованным «недопонимание» со стороны Василия, мне бы тоже не понравился упрёк в мою сторон
              Наверно ты прав. Думаю, будет правильнее удалить это. Статья чисто техническая. И не хотелось бы придавать ей какую-то эмоциональную окраску. И у меня нет никакого упрёка или претензий ни к Василию как к разработчику, ни к pdoTools. Многие из нас участвовали в совершенствовании этой библиотеки. Поэтому знаем все её преимущества. А Василий потратил огромное количество своего времени на её развитие. Только неблагодарный может предъявлять какие-то претензии. Я точно к таким не отношусь.

              А недопонимание объясняется легко. К сожалению, у нас с Василием давно уже нет взаимопонимания. И уважительного отношения на личностном уровне. Но я от этого не страдаю. Уверен, и он тоже. И в дальнейшем я не планирую повышать нулевой уровень нашего общения.

              И в конце статьи тогда стоило бы уточнить про предустановку pdoTools
              А бывают сайты без pdoTools? Лендинги наверно? Но про них говорить смысла нет. Просто я в статье закрепил то, о чем много раз говорил и в чатах и комментариях в ответ на вопросы типа насколько быстрее будет работать сайт, если в карточке товара заменить синтаксис MODX на Fenom. В одном из своих последних комментариев тут я как раз и писал, что главная причина ускорения сайта — это pdoTools.

              Многие разработчики сами замечают, что после замены ничего не изменилось по скорости. Как и на не заметил прироста на своём сайте. В этой статье я объяснил почему. Да и сам Василий в своём сегодняшнем посте тоже. Цифры для pdoParser до 100 чанков. Большинство сайтов (может даже 90%) использует пагинацию и даже 100 чанков парсить в цикле не будет. Не у всех на каждой странице сайта 890 комментариев.
            Misha Bulic
            27 апреля 2022, 13:41
            0
            У меня такой вопрос, если всё переписано на феном, но внутри сниппета по умолчанию выводится вот так:
            @INLINE <ol class="breadcrumb">[[+output]]</ol>
            значит ли это что я параллельно использую стандартный парсер?
              Наумов Алексей
              27 апреля 2022, 15:12
              +1
              насколько помню, такие простые теги pdoTools обработает без парсинга, сделав просто str_replace
                Сергей Шлоков
                28 апреля 2022, 06:44
                0
                Алексей выше правильно написал. Простые теги pdoTools заменяет значениями средствами PHP без парсинга.

                Чтобы не беспокоить почитателей Василия, который написал интересную статью, только совсем про другое, напишу на своём сайте, в чём Fenom проигрывает стандартному парсеру. Тогда сразу будет понятно, почему я говорю, что тест Василия синтетический.
                  Дима Сайт old см. профиль
                  29 апреля 2022, 01:46
                  +1
                  Сергей, тут читатели почитатели — программисты в основном, а они (мы) довольно прагматичны.

                  В лично моих глазах и Василий и Вы достойны всяческих похвал и почетных мест в зале/аллее славы MODX!

                  Теперь по теме:
                  Наверное, чтобы.избежать разночтений, я только хочу посоветовать для прагматичной точности ваших слов использовать вместо «стандартный парсер» или «MODX парсер» понятную всем здесь формулировку: modParser либо pdoParser. Где то здесь видел что вы считаете что сайтов на MODX без pdoTools в принципе почти нет и потому стандартный для вас это pdoParser.

                  Я думаю именно этот мелкий на первый взгляд недочёт в вашей статье и всколыхнул сообщество.

                  Я сам недавно писал где то тут в комментах что с появлением fenom возрасла скорость, за счёт отказа от сниппета if и костылей в виде динамической генерации имени сниппета, которые описал Василий в своем недавнем посте. Вы мне в том комменте ответили что я не врубаю как это работает, а я имел ввиду только отказ от рекурсии изнутри.

                  Признаться честно, я фанат смешанного синтаксиса, потому что синтаксис MODX-тегов считаю очень крутым, простым и понятным.
                  Мне как разработчику безусловно нужна скорость итоговая, но и удобство и красота кода для меня не последние слова ;) я уверен и смарти в зумИксе не парсит изнутри наружу рекурсивно, так что тут с феномом не будет разницы.

                  Пользуясь случаем хочу всем, кто просвещает тут людей вроде меня, не готовых лезть под капот парсеров в силу недостатка скиллов, ещё раз сказать спасибо. Ведь находить нужные слова, ничего не перепутать и подобрать формулировки, чтобы небыло разночтений бывает очень не просто!
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                20