В ходе обсуждения какие замеры хочется посмотреть мы для себя выделили 3 основных момента - родной шаблонизтор .net, bemhtml внутри своей экосистемы(node.js) и наш пакет. Для тестирования мы подготовили один набор синтетических данных, в которые входят несложные шаблоны.
Для синтетических тестов мы сгенерировали рутовый блок с тремя уровнями вложенности.
root->group1..100->item1..3
Ссылка на полный шаблон. Ссылка на Razor шаблон
block('root').content()(function() {
return this.ctx.items;
});
block('group')(
tag()('ol'),
attrs()(function() {
return { title: this.ctx.title };
})
);
block('item')(
tag()('li'),
content()(function() {
return [
{
elem: 'label',
content: 'text:'
},
{
elem: 'text',
content: this.ctx.text
}
];
}),
elem('label').tag()('strong'),
elem('text').tag()('span')
);
var templates = require('./Bem/desktop.bundles/default/default.bemhtml'),
bemjson = require('./test.bemjson.json'),
i, result;
console.time('someFunction');
for (i = 0; i < 1000; i++) {
templates.BEMHTML.apply(bemjson);
}
console.timeEnd('someFunction');
Вот тут лежат такие же тесты на .NET.
И так получив базовый набор данных в виде 100 блоков мы начали гонять их шаблонизацию по 1000 раз в разных средах. Получив первые данные было решено поменять значения и генерировать 100 раз по 1000 блоков, при этом замеры замедлились но во всех плоскостях линейно, в связи с чем было решено оставить один набор данных, так как в остальных время изменялось строго линейно. Разница между шаблонизаторами была довольно большой и первое что нам казалось значительно замедляет шаблонизацию в .NET это сериализация, в связи с чем было решено добавить тест кейс без сериализации.
Тест | Среднее время после 10 прогонов(ms) |
---|---|
Razor | 400 |
Node.js | 2300 |
.NET BEMHTML | 5600 |
.NET BEMHTML( - serialize) | 3500 |
Razor
является императивным шаблонизатором при этом родным, таким образом он просто не может быть медленнее чем BEMHTML
в любом своем проявлении, вопрос только во сколько раз:
Относительно родного node.js
Razor
быстрее в 5.75 раз, а относительно BEMHTML+.NET
в 14 раз. Это дофига, причем очень сильно дофига.
Все же, BEMHTML
надо сравнивать с BEMHTML
. И тут BEMHTML+.NET
медленее всего в 2.43 раза. Первое что пришло нам в голову это сериализация, в node.js
тестах ее нет, но в реальной жизни она обязательно будет. И поэтому было решено сравнивать непосредственно с версией без сериализации - итого в 1.5 раза.
Проблему скорости сериализации решить невозможно, так как это уже не зависящий от нас процесс. Проанализировав результаты мы нашли 2 пути дальнейшего развития данного проекта:
у нас разница между node.js
и нашей реализацией состовляет 1200ms. Надо найти на что тратится каждая милисикунда и найти места где можно оптимищировать и можно ли вообще.
Цель выйти на разницу не более 300ms.
Вторая идея компилировать BEMHTML
в Razor
. Да мы потеряем при этом очень много возможностей самого шаблонизатора, но при этом сможем выдавать пользователю родные Razor
шаблоны на выходе. Как планируется реализовать - добавляем специальную конструкцию объявления BEM
сущности, навешиваем скрипт на запуск во время сборки и вызываем BEMHTML.apply
на каждую заглушку после сохраняем уже полноценные Razor
шаблоны.
После всех исследований производительности, кажется что пока рано использовать данную технологию в нагруженных системах.