Низкая скорость генерации страниц и значительное потребление оперативной памяти у тем дизайнов с огромным количеством настроек в theme.xml!

Вся проблема в постоянном парсинге массива <settings>...</settings> из файла theme.xml.

На теме Default, например, пустая страница /compare/ генерируется за 40-50 мсек и используется 4-5 МБайт оперативной памяти .

А на темах с большим кол-вом настроек(Mastershop, Megashop, Ahead etc) - за 80-120 мсек и используется уже 9-10 Мбайт оперативной памяти.

То есть разница в потреблении и скорости из-за постоянного парсинга в массив $theme_settings.

Настройки темы очень редко меняются - зачем постоянно парсить theme.xml.

Можно этот массив где-то кешировать и обновлять если только файл theme.xml был изменён?

Так можно было бы уменьшить потребление памяти на 3-4 Мбайта и увеличить скорость выполнения.

7 ответов

  • 1
    Nail 7 февраля 2022 12:47 #

    На счет уменьшения потребления памяти на 3-4 Мбайта - погорячился.

    Там в итоге выходит только 800-1000 Кбайт после включения waSerializeCache.

    Но и это уже значительная экономия )

    Похоже, надо в этих огромных темах оптимизировать использование несколько сотен переменных (их там около 800-900 штук постоянно подгружается).

    • +1
      Anton F Anton F 8 февраля 2022 14:50 #

      Можно удалить неиспользуемые узлы <(name|description|value) locale="en_US">

      Проблема не столько в кол-ве переменных, сколько в их использовании, пример из темы Default:

          {if $theme_settings.font_family|strstr:'_google_'}
          {if $theme_settings.font_family|strstr:'fira'}{$_real_font_name = 'Fira+Sans:400,500,700,400italic,500italic,700italic'}{/if}
          {if $theme_settings.font_family|strstr:'opensans'}{$_real_font_name = 'Open+Sans:400,700,700italic,400italic'}{/if}
          ...
          <link href='https://fonts.googleapis.com/css?family={$_real_font_name}&subset=latin,cyrillic' rel='stylesheet'>
          {/if}
      {if $theme_settings.header_links == 'site-pages'}
          {if $wa->site}{$_links = $wa->site->pages()}{/if}
      {elseif $theme_settings.header_links == 'shop-pages'}
          {if $wa->shop}{$_links = $wa->shop->pages()}{/if}
          ...
      {elseif $theme_settings.header_links != 'none'}
          {$_links = $wa->apps()}
      {/if}

      ну и inline include без надобности.

      • +1
        Nail Nail 9 февраля 2022 14:06 #

        У темы Default особых проблем со скоростью генерации нету.

        Я говорил про проблемы у громоздких тем с большим кол-вом настроек.

        А про include inline можете подробнее написать?

        В справке smarty - об этой опции только одно предложение.

        Частое использование inline отрицательно сказывается или наоборот?

        • +1
          Anton F Anton F 9 февраля 2022 15:18 #

          если стоит inline, то шаблон рендерится как часть шаблона в который он включен, иначе он рендерится отдельно. в первом случае при изменении хотя бы одного шаблона все inline шаблоны рендерятся по новой, а во втором - только те, что изменены т.е. в разы быстрее.

          • +1
            Nail Nail 9 февраля 2022 16:05 #

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

            можно это и не учитывать.

            они же всё-равно потом в wa-cache помещаются.

            • +2
              Anton F Anton F 9 февраля 2022 16:20 #

              ты путаешь компиляцию php кода из smarty шаблонов и собственно кеширование

        • +1
          Anton F Anton F 9 февраля 2022 15:25 #
          У темы Default особых проблем со скоростью генерации нету.

          на фоне громоздких тем - да, но готовые темы созданы для малого бизнеса - я не видел крупных магазинов на готовых темах из маркета, хотя бы без оптимизации/кастомизации

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите