патч lookupView
Теперь реализован через Map вместо Array.
Время, затрачиваемое на запуск приложения в lookupView (для экземпляра разработки):
-
без патча: 124 мс
Firefox Profiler (стек вызовов отфильтрован поlookupView) -
с патчем: 9 мс
Firefox Profiler (стек вызовов отфильтрован поlookupView)
Экономия времени: ~115 мс
Это сокращает время, затрачиваемое внутри appendOutletView, с 1,083 мс до 946 мс (для экземпляра разработки).
патч для необработанных хелперов Handlebars
Да, это фактически копирование с одним изменением: используется недорогая проверка isPath.
// заменяет @ember/-internals/utils isPath
// @see: https://github.com/emberjs/ember.js/blob/3537670c14883346e11e841fcb71333384fcbc87/packages/%40ember/-internals/metal/lib/path_cache.ts#L5-L7
// @see: https://github.com/emberjs/ember.js/blob/255a0dd3c7de1187f4a2f61a97cf78bfff8f66a8/packages/%40ember/-internals/glimmer/lib/utils/bindings.ts#L70
let isPath = context.indexOf('.') > -1;
Например, renderTopicListItem в конечном итоге вызывает множество вызовов _getPath (ещё 50–100 мс экономии):
Firefox Profiler (стек вызовов отфильтрован по _getPath внутри renderTopicListItem)
Возможно, дорогие вызовы _getPath — это то, что нужно оптимизировать в Ember.js, а не в Discourse.
Также обратите внимание на Firefox Profiler, чтобы получить представление о выполнении JavaScript: