Искать  
 
   
 
Скорость работы шаблонов
Отправлено: 24 Март 2011 05:29 P.M.   [ Игнорировать ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Сегодня занимался оптимизацией сайта (уж очень медленно он клацался).
Заметил особенность
В любом случае выполняется весь код шаблоне, не принимая во внимание возможные ветвления.
Мне кажется, на вынесении в embed-шаблоны части кода, можно добится небольшого увеличения скорости работы.
К примеру
Начальный код

{if 1==1}
   {exp
:channel:entries channel="channel_name" limit="100"}
      {title}
   {
/exp:channel:entries}
{if
:else}
   {exp
:channel:entries channel="channel_name" limit="150"}
      {title}
   {
/exp:channel:entries}
{
/if} 

В TEMPLATE DEBUGGING видно что обрабатывался код как для limit=“100” так и для limit=“150”
Средняя скорость выполнения на моих тестовых данных - 0.77 секунды

Конечный код - вынесли часть кода в embed-шаблоны test_if_part1 и test_if_part2

{if 1==1}
   {embed
="group_name/test_if_part1"}
{if
:else}
   {embed
="group_name/test_if_part2"}
{
/if} 

В TEMPLATE DEBUGGING видно что обрабатывался только код для limit=“100”
Средняя скорость выполнения на моих тестовых данных - 0.3 секунды

Теперь попробуем оптимизировать вызов exp:channel:entries при помощи disable=“categories|member_data|category_fields|custom_fields|pagination”
Исходный код

{if 1==1}
   {exp
:channel:entries channel="places" limit="100" disable="categories|member_data|category_fields|custom_fields|pagination"}
      {title}
   {
/exp:channel:entries}
{if
:else}
   {exp
:channel:entries channel="places" limit="150" disable="categories|member_data|category_fields|custom_fields|pagination"}
      {title}
   {
/exp:channel:entries}
{
/if} 

Средняя скорость 0.11 сек

Конечный код (с выносом обработки в embed-шаблоны)
Средняя скорость 0.07 сек


Небольшое исследование влияния отключения разных возможностей exp:channel:entries показало что наибольший результат в МОЕМ случае это отключение disable=“categories”
В вашем случае возможен другой вариант
Конечный код с disable=“categories” показал в среднем 0.09 сек

В то же время, я где то читал рекомендации не использовать {embed} (т.к. сильно замедляется скорость генерации странички)

Выводы:
если есть ветвление, то вынеся exp:channel:entries с большим limit, можно ускорить работу
если использовать disable, то можно также значительно (до 7 раз в моем случае) ускорить скорость обработки (хотя disable действительно сильно режет возможности exp:channel:entries)

Профиль
 
 
Отправлено: 24 Март 2011 07:33 P.M.   [ Игнорировать ]   [ # 1 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07

попробуй еще примерно так:

{if 1==1}
   {exp
:channel:entries channel="channel_name" limit="100"}
      {title}
   {
/exp:channel:entries}
{
/if}
{if 1
!=1}
   {exp
:channel:entries channel="channel_name" limit="150"}
      {title}
   {
/exp:channel:entries}
{
/if} 

если включить отладку и смотреть на то сколько памяти расходуется, то при embed будем больше ну и количество запросов тоже (в данном случае только на 1, но а если много embed…)

еще ускоряет отключение отслеживания + если есть возможность поставить на сервер какой нибудь акселератор

еще очень большой прирост производительности дает использования модуля Template Morsels в него на кеширование можно запихать такие куски кода, но он платный...

Профиль
 
 
Отправлено: 25 Март 2011 08:44 P.M.   [ Игнорировать ]   [ # 2 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

ваш вариант все равно выполняет 2 запроса (с limit = 100, limit = 150)
за советы - спасибо, посмотрю

Профиль
 
 
Отправлено: 26 Март 2011 01:04 P.M.   [ Игнорировать ]   [ # 3 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

@MaxStoun
У вас что, выделенный сервер, и всеравно нехватает ресурсов?
Если нет - завтра к вам подселят какого-нибудь монстрика
собранного кривыми руками, и все начинай сначала.
Распределение ресерсов на шаред-хостинге - МИФ!
Борьба за выживание (оптимизация) в таких условиях не приносит должных результатов.
А если и да, то ненадолго...
Что же касается конструкции шаблонов, то для того, чтобы включить какой-либо
из фрагментов в код основного шаблона скрипту необходимо произвести ряд процедур...
Посему есть смысл в этом лишь в тех случаях, когда там (в эмбеде) сидит несколько тяжелых
запросов к б.д., а сам фрагмент при этом кешируется...

Профиль
 
 
Отправлено: 26 Март 2011 01:33 P.M.   [ Игнорировать ]   [ # 4 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Нет, ресурсов хватает.
Это просто были рассуждения вслух.
Я просто смотрел что каждый вызов функций Facebook Connect (FBC) от SolSpace занимает продолжительное время.
Выходил что на каждый шаблон у меня вызывалось по несколько раз функции FBC, которые выполнялись по 0.4 сек !
Я снизил кол-во обращений к таким функциям , и получил бешенный прирост производительности серверной части (до 75 % на некоторых страничках....)
Просто удивился что конструкция

{if}
   
.. do something ...
{if:else}
   {exp
:fbc:....}
{
/if} 

все равно запрашивает выполнение тяжелой функции, и вынес ее в embed

По поводу оптимизации серверной части - я согласен что в большинстве случаев это не так полезно, т.к. время когда клиент увидит страничку состоит из Время_обработки_скрипта_на_сервере + Время_получения_браузером_всех_необходимых_данных (типа картинок и т.п.)

Профиль
 
 
Отправлено: 26 Март 2011 01:46 P.M.   [ Игнорировать ]   [ # 5 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

С дополнениями от Solspace нужно быть очень осторожным!
Они настолько небрежно написаны, что не выдерживают никакой критики...

Профиль
 
 
Отправлено: 26 Март 2011 01:58 P.M.   [ Игнорировать ]   [ # 6 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Если уж говорить про FBC - SolSpace использует старый Facebook API (Rest API), который уже deprecated, и часть функций работает не так как описано в инструкции.
Ребята с SolSpace переписывать FBC не хотят, хотя даже на Rest API ему можно дописать кучу вкусных вещей по выборке дополнительных данных от пользователя facebook (типа день рождения и т.п.).

Профиль
 
 
Отправлено: 26 Март 2011 04:33 P.M.   [ Игнорировать ]   [ # 7 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07
MaxStoun - 25 Март 2011 08:44 P.M.

ваш вариант все равно выполняет 2 запроса (с limit = 100, limit = 150)
за советы - спасибо, посмотрю

нет, я имел ввиду что вариант

{if 1==1}
.......
{/if}
{if 1
!=1}
...............
{/if} 

быстрее чем

{if}
   
...
{if:else}
   
....
{/if} 

посмотрите на время исполнения....

а количество запросов уже увеличивается при подключении дополнительных шаблонов через embed….

поставил eAccelerator и странички вылетают весом от 0,5 до 2-3мб ))

Профиль
 
 
Отправлено: 07 Апрель 2011 08:47 P.M.   [ Игнорировать ]   [ # 8 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

Почему в условных конструкциях код отрабатывается дважды? Потому что они парсятся в самом конце. То есть ты делаешь выборку limit=“100”  потом  limit=“150” и только потом согласно условным конструкциям решаешь, что выводить. Но запросов то вышло в 2 раза больше.

Проблема решаема. Используем плагин IfElse. Оборачиваем свои условные конструкции и меняем порядок парсинга.

{exp:ifelse parse=“inward”} 
{if}
  .. do something ...
{if:else}
  {exp:fbc:....}
{/if}
{/exp:ifelse}

К сожалению, не работает со вложенными условными конструкциями, но и эта проблема решаема плагином свичи от этого же автора http://www.hallmark-design.co.uk/

Профиль
 
 
Отправлено: 08 Апрель 2011 02:40 P.M.   [ Игнорировать ]   [ # 9 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Спасибо, посмотрю этот плагин.

Профиль