bem-xjst icon indicating copy to clipboard operation
bem-xjst copied to clipboard

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

Open vill opened this issue 6 years ago • 5 comments

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

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

vill avatar Mar 12 '18 12:03 vill

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

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

miripiruni avatar Mar 12 '18 12:03 miripiruni

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

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 %.

miripiruni avatar Mar 16 '18 09:03 miripiruni

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

vill avatar Mar 16 '18 10:03 vill

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

miripiruni avatar Mar 16 '18 10:03 miripiruni

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

miripiruni avatar Mar 16 '18 10:03 miripiruni