15 янв. 2020
РедактироватьПроизводительность серверного рендеринга в preact
В предыдущем посте я упоминал про медленный рендеринг preact на
стороне ноды. Но после публикации в чатике индивеба
усомнились в моих цифрах производительности. И я решил измерить
производительность чуть лучше. Я писал про 200-300 мс, но это были цифры которые
я увидел во вкладке network в браузере. Как оказалось, далеко не всё это время
занимает выполнение моего кода. В данный момент после старта приложения первый
http запрос отрабатывает в среднем за 100 мс. Последующие запросы за 50 мс. Это
с выключенным кешированием. Проверял на главной странице с двумя постами. Я
решил замерить три параметра. Это время рендеринга preact, извлечение css с
помощью goober
и сериализацию json. С измерением сериализации json возникла
некоторая странность. Иногда она выполняется аномально долго, при этом там
всегда одинаковые данные. Поэтому, в результатах будет два варианта этого
показателя, со всеми данными и с отфильтрованными аномальными значениями. Ну и
да, сериализация выглядит вот так
const data = JSON.stringify(JSON.stringify(context.data));
Ну и собственно результаты | рендеринг приложения | извлечение css | сериализация json | сериализация json отфлиьтрованая |
---|---|---|---|---|
Среднее значение первого запуска | 15.337ms | 0.534ms | 0.357ms | 0.357ms |
Среднее значение последующих запусков | 3.172ms | 0.047ms | 1.565ms | 0.378ms |
Минимальное значение первого запуска | 14.423ms | 0.135ms | 0.205ms | 0.205ms |
Минимальное значение последующих запуска | 1.934ms | 0.037ms | 0.145ms | 0.145ms |
Максимальное значение первого запуска | 16.373ms | 1.009ms | 0.574ms | 0.574ms |
Максимальное значение последующих запуска | 5.876ms | 0.082ms | 16.826ms | 0.989ms |
Хорошо видна оптимизирующая работа v8, поэтому первый запуск в среднем в 5 раз медленнее чем последующие. К сериализации json это отношения не имеет, так как там работает нативный модуль. Ну и видимо никакое кеширование на самом деле не нужно, по крайней мере при таком маленьком приложении, ибо лишние 2-5 мс мало на что влияют. Интересно будет повторить эксперимент когда приложение будет немного побольше.
рендеринг приложения | извлечение css | сериализация json | |
---|---|---|---|
1.0 | 16.373ms | 0.787ms | 0.574ms |
1.1 | 2.930ms | 0.047ms | 7.589ms |
1.2 | 3.009ms | 0.054ms | 0.257ms |
1.3 | 2.777ms | 0.040ms | 0.254ms |
1.4 | 2.408ms | 0.037ms | 3.570ms |
1.5 | 2.760ms | 0.042ms | 0.253ms |
2.0 | 14.658ms | 0.540ms | 0.475ms |
2.1 | 4.221ms | 0.064ms | 0.415ms |
2.2 | 3.233ms | 0.082ms | 0.654ms |
2.3 | 2.828ms | 0.045ms | 0.276ms |
2.4 | 2.847ms | 0.042ms | 3.212ms |
2.5 | 2.869ms | 0.050ms | 0.272ms |
3.0 | 15.878ms | 0.135ms | 0.238ms |
3.1 | 4.624ms | 0.052ms | 0.257ms |
3.2 | 3.268ms | 0.055ms | 0.989ms |
3.3 | 2.638ms | 0.041ms | 0.425ms |
3.4 | 5.426ms | 0.040ms | 0.665ms |
3.5 | 2.475ms | 0.050ms | 0.261ms |
4.0 | 15.353ms | 0.198ms | 0.295ms |
4.1 | 2.739ms | 0.048ms | 16.826ms |
4.2 | 2.312ms | 0.044ms | 0.150ms |
4.3 | 2.215ms | 0.038ms | 0.314ms |
4.4 | 2.121ms | 0.040ms | 0.152ms |
4.5 | 1.934ms | 0.037ms | 0.145ms |
5.0 | 14.423ms | 1.009ms | 0.205ms |
5.1 | 5.129ms | 0.069ms | 0.341ms |
5.2 | 3.054ms | 0.041ms | 0.278ms |
5.3 | 2.796ms | 0.040ms | 0.493ms |
5.4 | 5.876ms | 0.046ms | 0.386ms |
5.5 | 2.833ms | 0.039ms | 0.702ms |