Проект для аналитики библиотек шаблонизаторов на JVM языках
ЯП | Версия |
---|---|
Java | 17 |
Kotlin | 1.8.0 |
Scala | 2.13.16 |
Clojure | 1.12.0 |
Название | Версия | Ссылка на GitHub |
---|---|---|
FreeMarker | 2.3.23 | 🔗 GitHub |
Thymeleaf | 3.1.0.RELEASE | 🔗 GitHub |
Pebble | 3.2.2 | 🔗 GitHub |
Mustache | 0.9.10 | 🔗 GitHub |
Fizzed | 2.1.0 | 🔗 GitHub |
Trimou | 2.5.0.Final | 🔗 GitHub |
Velocity | 1.7 | 🔗 GitHub |
Liqp | 0.9.1.3 | 🔗 GitHub |
HTTL | 1.0.11 | 🔗 GitHub |
Jinjava | 2.7.4 | 🔗 GitHub |
XDocReport | 2.1.0 | 🔗 GitHub |
YARG | 2.2.14 | 🔗 GitHub |
JasperReports | 6.7.0 | 🔗 GitHub |
Docx-Stamper | 2.5.0 | 🔗 GitHub |
BIRT | 4.4.1 | 🔗 GitHub |
Handlebars | 4.4.0 | 🔗 GitHub |
Barber | 2024.01.12.173005-933c241 | 🔗 GitHub |
Scalate | 1.10.1 | 🔗 GitHub |
Stencil | 0.6.1 | 🔗 GitHub |
├── /benchmark # Модуль нагрузочного тестирования
│ ├── /src
│ │ ├── /main # Исходники тестируемых компонентов
│ │ │ ├── /java # Библиотеки на JAVA
│ │ │ │ └── ru.sbertech.platformv.print.benchmark.templateengine
│ │ │ ├── /clojure # Библиотеки на Clojure
│ │ │ │ └── ru.sbertech.platformv.print.benchmark.clojure.templateengine
│ │ │ ├── /kotlin # Библиотеки на Kotlin
│ │ │ │ └── ru.sbertech.platformv.print.benchmark.kotlin
│ │ │ │ ├── /templateengine
│ │ │ │ ├── /mapper
│ │ │ │ └── /model
│ │ │ └── /scala # Библиотеки на Scala
│ │ │ └── ru.sbertech.platformv.print.benchmark.scala
│ │ │ ├── /templateengine
│ │ │ ├── /mapper
│ │ │ └── /model
│ │ ├── /test # Unit тестирование с использованием StopWatch
│ │ │ └── /java
│ │ │ └── ru.sbertech.platformv.print.benchmark.templateengine
│ │ └── /resources
│ │ ├── /db/changelog # Миграции БД
│ │ ├── /templates # Исходники шаблонов
│ │ ├── application.yaml # Конфигурация ресурсов
│ │ ├── httl.properties
│ │ └── logback.xml # Настройка Log4J с отключением профилей логирования
│ └── pom.xml # Импорт исходников шаблонизаторов
├── /model # Модуль предметной модели
│ ├── /src
│ │ ├── /main
│ │ │ └── /java
│ │ │ └── ru.sbertech.platformv.print.benchmark.domain
│ │ │ ├── /configuration
│ │ │ ├── /mapper
│ │ │ ├── /repository
│ │ │ └── /service
│ │ └── /resources # Настройка авто-конфигурации
│ │ └── /META-INF
│ │ ├── /spring
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── spring.factories
│ └── pom.xml # Проект, отвечающий за сборку компонентов Spring приложения
└── pom.xml # Корневой проект, содержащий версии используемых языков и библиотек
Тестирование движков происходило условной модели группы компаний с набором офисов.
Для всех движков использовался одинаковый шаблон со структурой:
- Список компаний
- Информация о компании
- Название
- Директор
- Центральный офис
- Инд. код
- Логотип
- Список дополнительных офисов
- Информации о офисе
- Название
- Адрес
- Доступные ресурсы
- Фотография
- Список сотрудников офиса
- Табельный номер
- Имя
- Должность
- Проект
- Стаж
- Зарплата
Преобразованный шаблон в PDF
ODT шаблон
Характеристика тестирования:
- Для замера времени использовалась компонент StopWatch из библиотеки Guava
- В качестве результатов замеров использовалось время выполнения 1000 операций
- Все шаблоны заранее выгружены из ресурсов (чтоб не учитывать время чтения из памяти)
Тестирование без оптимизаторов предполагает, что в замер входит:
- Создание движка (с отключенным кешированием)
- Рендер шаблона
@Test
public void benchmarkWithOutOptimizations() throws IOException {
Stopwatch sw = Stopwatch.createStarted();
for (int i = 0; i < 1000; i++) {
var engine = PebbleEngine.of(report, companies);
engine.process();
}
System.out.println(sw.elapsed(TimeUnit.MILLISECONDS) + " ms.");
}
Тестирование с оптимизацией предполагает, что в замер входит предварительное создание движка с включенным кешированием и операция рендера.
@Test
public void benchmarkWithOptimizations() throws IOException, TemplateException {
Stopwatch sw = Stopwatch.createStarted();
var engine = TrimouEngine.cachingOf(report, companies);
for (int i = 0; i < 1000; i++) {
engine.process();
}
System.out.println(sw.elapsed(TimeUnit.MILLISECONDS) + " ms.");
}