Skip to content

Latest commit

 

History

History
96 lines (77 loc) · 6.34 KB

BENCHMARKS.md

File metadata and controls

96 lines (77 loc) · 6.34 KB

Тестирование производительности.

В ходе обсуждения какие замеры хочется посмотреть мы для себя выделили 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

Razor является императивным шаблонизатором при этом родным, таким образом он просто не может быть медленнее чем BEMHTML в любом своем проявлении, вопрос только во сколько раз: Относительно родного node.js Razor быстрее в 5.75 раз, а относительно BEMHTML+.NET в 14 раз. Это дофига, причем очень сильно дофига.

Относительно node.js

Все же, BEMHTML надо сравнивать с BEMHTML. И тут BEMHTML+.NET медленее всего в 2.43 раза. Первое что пришло нам в голову это сериализация, в node.js тестах ее нет, но в реальной жизни она обязательно будет. И поэтому было решено сравнивать непосредственно с версией без сериализации - итого в 1.5 раза.

Выводы

Проблему скорости сериализации решить невозможно, так как это уже не зависящий от нас процесс. Проанализировав результаты мы нашли 2 пути дальнейшего развития данного проекта:

Ускорение

у нас разница между node.js и нашей реализацией состовляет 1200ms. Надо найти на что тратится каждая милисикунда и найти места где можно оптимищировать и можно ли вообще. Цель выйти на разницу не более 300ms.

Статический BEMHTML

Вторая идея компилировать BEMHTML в Razor. Да мы потеряем при этом очень много возможностей самого шаблонизатора, но при этом сможем выдавать пользователю родные Razor шаблоны на выходе. Как планируется реализовать - добавляем специальную конструкцию объявления BEM сущности, навешиваем скрипт на запуск во время сборки и вызываем BEMHTML.apply на каждую заглушку после сохраняем уже полноценные Razor шаблоны.

После всех исследований производительности, кажется что пока рано использовать данную технологию в нагруженных системах.