bem/bem-xjst

Производительность движка в некоторых случаях можно увеличить

vill opened this issue · 5 comments

vill commented

Всем привет. На мой взгляд движок в некоторых случаях делает ненужные вычисления, что влияет на производительность работы(сборки).

Possible Solution

Необходимо изменить порядок обработки режимов, например у себя(не на jS) я реализовал так:

ATTRS_MODE     = :attrs
BEM_MODE       = :bem
CLS_MODE       = :cls
CONTENT_MODE   = :content
JS_MODE        = :js
MIX_MODE       = :mix
MODS_MODE      = :mods
REPLACE_MODE   = :replace
TAG_MODE       = :tag

BEM_RELATED_MODES = [JS_MODE, MIX_MODE, MODS_MODE].freeze
TAG_RELATED_MODES = [BEM_MODE, *BEM_RELATED_MODES, CLS_MODE, ATTRS_MODE].freeze
MODES             = [REPLACE_MODE, TAG_MODE, *TAG_RELATED_MODES, CONTENT_MODE].freeze

Если после режима tag получается что html tag не нужен, тогда все режимы которые зависят от режима tag а их 6 штук не будут обрабатываться, зачем для них перебирать шаблоны делать в них вычисления(возможно даже apply и applyNext), если результат их работы некуда будет вывести? Это касается и режима bem и обработка связанных с ним режимов их 3 штуки, хотя возможно его выключают реже чем tag. Сейчас движок обходит всегда все режимы.

Ссылки на примеры:

bem = false
tag = false

Я про эту идею уже думал, она мне очень нравится. Вечером попробую изменить профит от такой экономии.

И, конечно, это мажорное изменение.

Сравниваю ревизии:

rev1: 'd830717eed5b9c4527c317ec4d71ed8be3eb017b', // после оптимизации
rev2: '8083faba3dd01657d88b3def5a796c2099f369c2',  // до оптимизации

На 2000 разных BEMJSON-ах. Довольно больших, взятых с реальных проектов.

Результат не очень разный до и после:

Percentile:  0.5
{ rev1: 4.094029,
  rev2: 4.126047,
  'diff abs': 0.03201799999999988,
  'diff percent': 0.7759969772520692 }

Percentile:  0.9
{ rev1: 6.168265,
  rev2: 6.238977,
  'diff abs': 0.07071200000000033,
  'diff percent': 1.133390938931178 }

Percentile:  0.95
{ rev1: 7.119671,
  rev2: 7.164754,
  'diff abs': 0.045082999999999984,
  'diff percent': 0.6292330483363417 }

На 95 процентиле разница с 0,6 %.

vill commented

Пускай 0,6% но они есть, может не часто отключают эти режимы поэтому такая цифра, все может быть, но на мой взгляд это не правильно когда работа ради работы.

Разумеется. Я ни в коем случае не спорю в этом вопросе. Результаты просто говорят о том, как часто в шаблонах, которые я использовал для теста, используется bem:false (18 раз) и tag:false (4 раза). Для примера всего шаблонов более 1000.

В итоге я не очень согласен с формулировкой заголовка таска. Так как не считаю, что производительность именно страдает. Но улучшить безусловно стоит.