From 3d6c6114d0e91b18d4db2d2c1701322d42738b07 Mon Sep 17 00:00:00 2001 From: darkside1102 <34370456+darkside1102@users.noreply.github.com> Date: Mon, 18 Mar 2019 00:30:04 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=BB=D0=BE=D0=B2=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2=20=D0=98.=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Домашнее задание HTML --- index.html | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..bb67e7e --- /dev/null +++ b/index.html @@ -0,0 +1,219 @@ + + + + + Document + + +
+

Блог компании Pravo.

+
+
+
+

КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ

+

Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то, + какой он красивый, ни то, какой он удобный. Никому не понравится, когда все + тормозит. Мы регулярно добавляем в Doc.One новую функциональность, + иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код + и новая логика. Всё это напрямую влияет на скорость работы интерфейса.

+

Что мы измеряем

+

Этапы первой загрузки:

+ +

Этапы отрисовки любой страницы:

+ + +
+

Как вы знаете, медиана – это серединное, а не среднее значение в выборке. + Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5. + В общем случае медиана отлично показывает, сколько грузится средний пользователь. + В случае ускорения или замедления медиана, конечно, изменится. Но она не может + рассказать, сколько пользователей ускорилось, а сколько замедлилось.

+

APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика + работает очень просто. Мы выбираем временной интервал [0; t], такой, что если + время показа страницы попало в него, то пользователь счастлив. Берем еще один + интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница + показана за это время, то пользователь в целом удовлетворен скоростью работы, + но уже не настолько счастлив. И применяем формулу:
+ (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).

+

Получается значение от нуля до единицы, которое, видимо, лучше всего показывает, + хорошо или плохо работает почта.

+
+

Как мы измеряем

+

Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять + причину замедления: медленнее стал отвечать сервер либо слишком долго + выполняется JavaScript. Выглядит это примерно так:

+ +
+					this.timings['look-ma-im-start'] = Date.now();
+					this.timings['look-ma-finish'] = Date.now();
+				
+
+

C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при + отправке рассчитываются. На этапах разница между “end” и “start” не считается, + а все вычисления производятся в конце:

+ + var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start']; + +

И на сервер прилетают подобные записи:

+ + serverResponse=50&domUpdate=60 + +

Как мы ускоряем

+

Чтобы снизить время загрузки почты при выходе новых версий, + мы уже делаем следующее:

+ +

Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой + передавать только diff между ней и той, которая сохранена у пользователя?» + В браузере же останется просто наложить патч на клиенте.

+

На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например, + RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они + не получили должного распространения в браузерах и на серверах.

+

Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления, + начали искать реализации diff на JS. На популярных хостингах кода нашли + библиотеки:

+ +

Для окончательного выбора библиотеки нам нужно сравнить:

+ + + + + + + + + + + + + + + + +
БиблиотекаIE 9Opera 12
vcdiff 8 5
google diff 1363 76
+

После того как мы определились с библиотекой для диффа, нужно определиться с тем, + где и как хранить статику на клиенте.

+

Формат файла с патчами для проекта выглядит так:

+ +
+					[
+					{
+					"k": "jane.css",
+					"p": [patch],
+					"s": 4554,
+					{,
+					{
+					"k": "jane.css",
+					"p": [patch],
+					"s": 4554
+					}
+					]
+				
+
+

То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У + каждого объекта есть три свойства. k — названия ключа в localStorage для этого + ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для + ресурса актуальной версии, чтобы потом можно было проверить правильность + наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера. + Алгоритм Бройдена — Флетчера — Гольдфарба — Шанно (BFGS) + — итерационный метод численной оптимизации, предназначенный для + нахождения локального максимума/минимума нелинейного функционала + без ограничений.

+

Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:

+ +

Потому что он быстрый, компактный и легок в реализации.

+

Итог

+ Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах: + + + + + + + + + + + + + + + + + + + + + +
Релиз |С патчем |Без патча |
7.7.20 397 174 549
7.7.21 383 53 995
7.7.22 483 3 995
+
+

Автор: @doochik

+

С++ разработик

+

Электронная почта: (doochik@pravo.ru)

+

Компания: Pravo.ru

+
+ +
+

Комментарии (3):

+
- Mogaika (mogaika@pravo.ru) + +
+
+ А можете привести сравнение, на сколько быстрее грузится lite версия? +
+
- JIguse (mrawesome@pravo.ru) + +
+
+ Спасибо за статью, познавательно. Здорово, что Pravo.ru делится некоторыми + подробностями о внутренней работе сервисов. +
+
- Brister (brist89@pravo.ru) + +
+
+ (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает, + хорошо или плохо работает почта.
+ наверное все-таки от 0.5 до 1 +
+
- alexeimois (test@pravo.ru) + +
+
+
+
+ + + \ No newline at end of file