ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
+
+
+
+ Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
+ какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
+ тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
+ иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
+ и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
+
+
+
+
Что мы измеряем
+
Этапы первой загрузки:
+
+
подготовка;
+
загрузка статики (HTTP-запрос и парсинг);
+
исполнение модулей;
+
инициализация базовых объектов;
+
отрисовка.
+
+
Этапы отрисовки любой страницы:
+
+
подготовка к запросу на сервер;
+
запрос данных с сервера;
+
шаблонизация;
+
обновление DOM.
+
+
+ — Ок, теперь у нас есть метрики, мы можем отправить их на сервер - говорим мы
+ — Что же дальше? - вопрошаете вы
+ — А давай построим график! - отвечаем мы
+ — А что будем считать? - уточняете вы
+
+
+ Как вы знаете, медиана – это серединное, а не среднее значение в выборке.
+ Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.
+ В общем случае медиана отлично показывает, сколько грузится средний пользователь.
+
+
+ В случае ускорения или замедления медиана, конечно, изменится. Но она не может
+ рассказать, сколько пользователей ускорилось, а сколько замедлилось.
+
+
+ APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика
+ работает очень просто. Мы выбираем временной интервал [0; t], такой, что если
+ время показа страницы попало в него, то пользователь счастлив. Берем еще один
+ интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница
+ показана за это время, то пользователь в целом удовлетворен скоростью работы,
+ но уже не настолько счастлив. И применяем формулу:
+
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
+
+
Как мы измеряем
+
+ Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять
+ причину замедления: медленнее стал отвечать сервер либо слишком долго
+ выполняется JavaScript. Выглядит это примерно так:
+
+ C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
+ отправке рассчитываются. На этапах разница между “end” и “start” не считается,
+ а все вычисления производятся в конце:
+
+
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];
+
И на сервер прилетают подобные записи:
+
serverResponse=50&domUpdate=60
+
+
+
Как мы ускоряем
+
Чтобы снизить время загрузки почты при выходе новых версий,мы уже делаем следующее:
+
+
включаем gzip;
+
выставляем заголовки кэширования;
+
фризим CSS, JS, шаблоны и картинки;
+
используем CDN;
+
+
+ Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой
+ передавать только diff между ней и той, которая сохранена у пользователя?»
+ В браузере же останется просто наложить патч на клиенте.
+
+
+ На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,
+ RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они
+ не получили должного распространения в браузерах и на серверах.
+
+
+ Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,
+ начали искать реализации diff на JS. На популярных хостингах кода нашли
+ библиотеки:
+
+
- VCDiff
+ - google-diff-patch-match
+
Для окончательного выбора библиотеки нам нужно сравнить:
+
+
+
Библиотека
+
IE 9
+
Opera 12
+
+
+
vcdiff
+
8
+
5
+
+
+
google diff
+
1363
+
76
+
+
+
+ После того как мы определились с библиотекой для диффа, нужно определиться с тем,
+ где и как хранить статику на клиенте.
+
+ То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У
+ каждого объекта есть три свойства. k — названия ключа в localStorage для этого
+ ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для
+ ресурса актуальной версии, чтобы потом можно было проверить правильность
+ наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
+
+
+ Алгоритм Бройдена — Флетчера — Гольдфарба — Шанн
+ (BFGS)
+ — итерационный метод численной оптимизации, предназначенный для
+ нахождения локального максимума/минимума нелинейного функционала
+ без ограничений.
+
+
+ дано ε, x0
+ инициализировать Η0
+ k = 0
+ while ||∇ƒk|| > ε
+ найти направление
+ pk = -Ck∇ ƒk
+ вычислить
+ xk+1 = xk + αk pk,
+ αk удовлетворяет условиям Вольфе
+ обозначить
+ sk = xk+1 - xk и
+ yk = ∇ ƒk+1 - ∇ ƒk
+ вычислить
+ Ck+1
+ k = k + 1
+ end
+
+
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
+
+ CRC16/32 - алгоритм нахождения контрольной суммы,
+ предназначенный для проверки целостности данных
+
+
+ md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
+ или дайджестов сообщения произвольной длины и последующей проверки
+ их подлинности.
+
+
Потому что он быстрый, компактный и легок в реализации.
+
+
+
Итог
+
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
+
А можете привести сравнение, на сколько быстрее грузится lite версия?
+
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
+
+ Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
+ подробностями о внутренней работе сервисов.
+
+
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
+
+ (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
наверное все-таки от 0.5 до 1
+
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗА
иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
-
+
Что мы измеряем
Этапы первой загрузки:
@@ -118,7 +122,7 @@
Как мы ускоряем
- VCDiff
- google-diff-patch-match
Для окончательного выбора библиотеки нам нужно сравнить:
-
+
Библиотека
IE 9
@@ -173,7 +177,7 @@
Как мы ускоряем
дано ε, x0
инициализировать Η0
- k = 0
+ k = 0 while ||∇ƒk|| > ε
найти направление
pk = -Ck∇ ƒk
@@ -185,7 +189,7 @@
Как мы ускоряем
yk = ∇ ƒk+1 - ∇ ƒk
вычислить
Ck+1
- k = k + 1
+ k = k + 1 end
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
@@ -203,7 +207,7 @@
Как мы ускоряем
Итог
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
-
+
Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
@@ -16,7 +16,7 @@
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗА
иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
-
+
Что мы измеряем
Этапы первой загрузки:
@@ -58,7 +58,7 @@
Что мы измеряем
но уже не настолько счастлив. И применяем формулу:
C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
отправке рассчитываются. На этапах разница между “end” и “start” не считается,
а все вычисления производятся в конце:
-
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];
+
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];>
И на сервер прилетают подобные записи:
-
serverResponse=50&domUpdate=60
+
serverResponse=50&domUpdate=60
Как мы ускоряем
@@ -109,8 +109,10 @@
Как мы ускоряем
начали искать реализации diff на JS. На популярных хостингах кода нашли
библиотеки:
-
- VCDiff
- - google-diff-patch-match
+
+ - VCDiff
+ - google-diff-patch-match
+
Для окончательного выбора библиотеки нам нужно сравнить:
@@ -158,37 +160,37 @@
Как мы ускоряем
наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
- дано ε, x0
- инициализировать Η0
- k = 0
- while ||∇ƒk|| > ε
+ дано ε, x0
+ инициализировать Η0
+ k = 0
+ while ||∇ƒk|| > ε
найти направление
- pk = -Ck∇ ƒk
+ pk = -Ck∇ ƒk
вычислить
- xk+1 = xk + αk pk,
- αk удовлетворяет условиям Вольфе
+ xk+1 = xk + αk pk,
+ αk удовлетворяет условиям Вольфе
обозначить
- sk = xk+1 - xk и
- yk = ∇ ƒk+1 - ∇ ƒk
+ sk = xk+1 - xk и
+ yk = ∇ ƒk+1 - ∇ ƒk
вычислить
- Ck+1
- k = k + 1
- end
+ Ck+1
+ k = k + 1
+ end
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
- CRC16/32 - алгоритм нахождения контрольной суммы,
+ CRC16/32 - алгоритм нахождения контрольной суммы,
предназначенный для проверки целостности данных
- md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
+ md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
или дайджестов сообщения произвольной длины и последующей проверки
их подлинности.
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
-
-
-
- Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
- какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
- тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
- иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
- и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
-
-
-
-
Что мы измеряем
-
Этапы первой загрузки:
-
-
подготовка;
-
загрузка статики (HTTP-запрос и парсинг);
-
исполнение модулей;
-
инициализация базовых объектов;
-
отрисовка.
-
-
Этапы отрисовки любой страницы:
-
-
подготовка к запросу на сервер;
-
запрос данных с сервера;
-
шаблонизация;
-
обновление DOM.
-
+
+ Блог компании Яндекс.
+
+
+
+
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
+
+
- — Ок, теперь у нас есть метрики, мы можем отправить их на сервер - говорим мы
- — Что же дальше? - вопрошаете вы
- — А давай построим график! - отвечаем мы
- — А что будем считать? - уточняете вы
+ Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
+ какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
+ тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
+ иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
+ и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
-
- Как вы знаете, медиана – это серединное, а не среднее значение в выборке.
- Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.
- В общем случае медиана отлично показывает, сколько грузится средний пользователь.
-
-
- В случае ускорения или замедления медиана, конечно, изменится. Но она не может
- рассказать, сколько пользователей ускорилось, а сколько замедлилось.
-
-
- APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика
- работает очень просто. Мы выбираем временной интервал [0; t], такой, что если
- время показа страницы попало в него, то пользователь счастлив. Берем еще один
- интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница
- показана за это время, то пользователь в целом удовлетворен скоростью работы,
- но уже не настолько счастлив. И применяем формулу:
-
- Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
- хорошо или плохо работает почта.
-
-
-
-
Как мы измеряем
-
- Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять
- причину замедления: медленнее стал отвечать сервер либо слишком долго
- выполняется JavaScript. Выглядит это примерно так:
-
- C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
- отправке рассчитываются. На этапах разница между “end” и “start” не считается,
- а все вычисления производятся в конце:
-
-
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];>
-
И на сервер прилетают подобные записи:
-
serverResponse=50&domUpdate=60
-
-
-
Как мы ускоряем
-
Чтобы снизить время загрузки почты при выходе новых версий,мы уже делаем следующее:
-
-
включаем gzip;
-
выставляем заголовки кэширования;
-
фризим CSS, JS, шаблоны и картинки;
-
используем CDN;
-
-
- Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой
- передавать только diff между ней и той, которая сохранена у пользователя?»
- В браузере же останется просто наложить патч на клиенте.
-
-
- На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,
- RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они
- не получили должного распространения в браузерах и на серверах.
-
-
- Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,
- начали искать реализации diff на JS. На популярных хостингах кода нашли
- библиотеки:
-
-
- - VCDiff
- - google-diff-patch-match
-
-
Для окончательного выбора библиотеки нам нужно сравнить:
-
-
-
Библиотека
-
IE 9
-
Opera 12
-
-
-
vcdiff
-
8
-
5
-
-
-
google diff
-
1363
-
76
-
-
-
- После того как мы определились с библиотекой для диффа, нужно определиться с тем,
- где и как хранить статику на клиенте.
-
- То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У
- каждого объекта есть три свойства. k — названия ключа в localStorage для этого
- ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для
- ресурса актуальной версии, чтобы потом можно было проверить правильность
- наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
-
-
- Алгоритм Бройдена — Флетчера — Гольдфарба — Шанн
- (BFGS)
- — итерационный метод численной оптимизации, предназначенный для
- нахождения локального максимума/минимума нелинейного функционала
- без ограничений.
-
-
- дано ε, x0
- инициализировать Η0
- k = 0
- while ||∇ƒk|| > ε
- найти направление
- pk = -Ck∇ ƒk
- вычислить
- xk+1 = xk + αk pk,
- αk удовлетворяет условиям Вольфе
- обозначить
- sk = xk+1 - xk и
- yk = ∇ ƒk+1 - ∇ ƒk
- вычислить
- Ck+1
- k = k + 1
- end
-
-
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
-
- CRC16/32 - алгоритм нахождения контрольной суммы,
- предназначенный для проверки целостности данных
-
-
- md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
- или дайджестов сообщения произвольной длины и последующей проверки
- их подлинности.
-
-
Потому что он быстрый, компактный и легок в реализации.
-
-
-
Итог
-
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
-
А можете привести сравнение, на сколько быстрее грузится lite версия?
-
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
-
- Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
- подробностями о внутренней работе сервисов.
-
-
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
-
- (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
- Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
- хорошо или плохо работает почта.
-
-
наверное все-таки от 0.5 до 1
-
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
+ — Ок, теперь у нас есть метрики, мы можем отправить их на сервер - говорим мы
+ — Что же дальше? - вопрошаете вы
+ — А давай построим график! - отвечаем мы
+ — А что будем считать? - уточняете вы
+
+
+ Как вы знаете, медиана – это серединное, а не среднее значение в выборке.
+ Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.
+ В общем случае медиана отлично показывает, сколько грузится средний пользователь.
+
+
+ В случае ускорения или замедления медиана, конечно, изменится. Но она не может
+ рассказать, сколько пользователей ускорилось, а сколько замедлилось.
+
+
+ APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика
+ работает очень просто. Мы выбираем временной интервал [0; t], такой, что если
+ время показа страницы попало в него, то пользователь счастлив. Берем еще один
+ интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница
+ показана за это время, то пользователь в целом удовлетворен скоростью работы,
+ но уже не настолько счастлив. И применяем формулу:
+
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
+
+
Как мы измеряем
+
+ Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять
+ причину замедления: медленнее стал отвечать сервер либо слишком долго
+ выполняется JavaScript. Выглядит это примерно так:
+
+ C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
+ отправке рассчитываются. На этапах разница между “end” и “start” не считается,
+ а все вычисления производятся в конце:
+
+
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];>
+
И на сервер прилетают подобные записи:
+
serverResponse=50&domUpdate=60
+
+
+
Как мы ускоряем
+
Чтобы снизить время загрузки почты при выходе новых версий,мы уже делаем следующее:
+
+
включаем gzip;
+
выставляем заголовки кэширования;
+
фризим CSS, JS, шаблоны и картинки;
+
используем CDN;
+
+
+ Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой
+ передавать только diff между ней и той, которая сохранена у пользователя?»
+ В браузере же останется просто наложить патч на клиенте.
+
+
+ На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,
+ RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они
+ не получили должного распространения в браузерах и на серверах.
+
+
+ Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,
+ начали искать реализации diff на JS. На популярных хостингах кода нашли
+ библиотеки:
+
+
+ - VCDiff
+ - google-diff-patch-match
+
+
Для окончательного выбора библиотеки нам нужно сравнить:
+
+
+
Библиотека
+
IE 9
+
Opera 12
+
+
+
vcdiff
+
8
+
5
+
+
+
google diff
+
1363
+
76
+
+
+
+ После того как мы определились с библиотекой для диффа, нужно определиться с тем,
+ где и как хранить статику на клиенте.
+
+ То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У
+ каждого объекта есть три свойства. k — названия ключа в localStorage для этого
+ ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для
+ ресурса актуальной версии, чтобы потом можно было проверить правильность
+ наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
+
+
+ Алгоритм Бройдена — Флетчера — Гольдфарба — Шанн
+ (BFGS)
+ — итерационный метод численной оптимизации, предназначенный для
+ нахождения локального максимума/минимума нелинейного функционала
+ без ограничений.
+
+
+ дано ε, x0
+ инициализировать Η0
+ k = 0
+ while ||∇ƒk|| > ε
+ найти направление
+ pk = -Ck∇ ƒk
+ вычислить
+ xk+1 = xk + αk pk,
+ αk удовлетворяет условиям Вольфе
+ обозначить
+ sk = xk+1 - xk и
+ yk = ∇ ƒk+1 - ∇ ƒk
+ вычислить
+ Ck+1
+ k = k + 1
+ end
+
+
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
+
+ CRC16/32 - алгоритм нахождения контрольной суммы,
+ предназначенный для проверки целостности данных
+
+
+ md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
+ или дайджестов сообщения произвольной длины и последующей проверки
+ их подлинности.
+
+
Потому что он быстрый, компактный и легок в реализации.
+
+
+
Итог
+
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
+
А можете привести сравнение, на сколько быстрее грузится lite версия?
+
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
+
+ Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
+ подробностями о внутренней работе сервисов.
+
+
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
+
+ (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
наверное все-таки от 0.5 до 1
+
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
- Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
+ Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
@@ -251,7 +251,7 @@
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
-
-
+
+
+ Блог компании Яндекс.
+
+
+
+
ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ
+
+
+
+ Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
+ какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
+ тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
+ иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
+ и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
+
+
+
+
Что мы измеряем
+
Этапы первой загрузки:
+
+
подготовка;
+
загрузка статики (HTTP-запрос и парсинг);
+
исполнение модулей;
+
инициализация базовых объектов;
+
отрисовка.
+
+
Этапы отрисовки любой страницы:
+
+
подготовка к запросу на сервер;
+
запрос данных с сервера;
+
шаблонизация;
+
обновление DOM.
+
- Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то,
- какой он красивый, ни то, какой он удобный. Никому не понравится, когда все
- тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность,
- иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код
- и новая логика. Всё это напрямую влияет на скорость работы интерфейса.
+ — Ок, теперь у нас есть метрики, мы можем отправить их на сервер - говорим мы
+ — Что же дальше? - вопрошаете вы
+ — А давай построим график! - отвечаем мы
+ — А что будем считать? - уточняете вы
-
-
-
Что мы измеряем
-
Этапы первой загрузки:
-
-
подготовка;
-
загрузка статики (HTTP-запрос и парсинг);
-
исполнение модулей;
-
инициализация базовых объектов;
-
отрисовка.
-
-
Этапы отрисовки любой страницы:
-
-
подготовка к запросу на сервер;
-
запрос данных с сервера;
-
шаблонизация;
-
обновление DOM.
-
-
- — Ок, теперь у нас есть метрики, мы можем отправить их на сервер - говорим мы
- — Что же дальше? - вопрошаете вы
- — А давай построим график! - отвечаем мы
- — А что будем считать? - уточняете вы
-
-
- Как вы знаете, медиана – это серединное, а не среднее значение в выборке.
- Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.
- В общем случае медиана отлично показывает, сколько грузится средний пользователь.
-
-
- В случае ускорения или замедления медиана, конечно, изменится. Но она не может
- рассказать, сколько пользователей ускорилось, а сколько замедлилось.
-
-
- APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика
- работает очень просто. Мы выбираем временной интервал [0; t], такой, что если
- время показа страницы попало в него, то пользователь счастлив. Берем еще один
- интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница
- показана за это время, то пользователь в целом удовлетворен скоростью работы,
- но уже не настолько счастлив. И применяем формулу:
-
- Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
- хорошо или плохо работает почта.
-
-
-
-
Как мы измеряем
-
- Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять
- причину замедления: медленнее стал отвечать сервер либо слишком долго
- выполняется JavaScript. Выглядит это примерно так:
-
- C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
- отправке рассчитываются. На этапах разница между “end” и “start” не считается,
- а все вычисления производятся в конце:
-
-
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];>
-
И на сервер прилетают подобные записи:
-
serverResponse=50&domUpdate=60
-
-
-
Как мы ускоряем
-
Чтобы снизить время загрузки почты при выходе новых версий,мы уже делаем следующее:
-
-
включаем gzip;
-
выставляем заголовки кэширования;
-
фризим CSS, JS, шаблоны и картинки;
-
используем CDN;
-
-
- Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой
- передавать только diff между ней и той, которая сохранена у пользователя?»
- В браузере же останется просто наложить патч на клиенте.
-
-
- На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,
- RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они
- не получили должного распространения в браузерах и на серверах.
-
-
- Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,
- начали искать реализации diff на JS. На популярных хостингах кода нашли
- библиотеки:
-
-
- - VCDiff
- - google-diff-patch-match
-
-
Для окончательного выбора библиотеки нам нужно сравнить:
-
-
-
Библиотека
-
IE 9
-
Opera 12
-
-
-
vcdiff
-
8
-
5
-
-
-
google diff
-
1363
-
76
-
-
-
- После того как мы определились с библиотекой для диффа, нужно определиться с тем,
- где и как хранить статику на клиенте.
-
- То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У
- каждого объекта есть три свойства. k — названия ключа в localStorage для этого
- ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для
- ресурса актуальной версии, чтобы потом можно было проверить правильность
- наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
-
-
- Алгоритм Бройдена — Флетчера — Гольдфарба — Шанн
- (BFGS)
- — итерационный метод численной оптимизации, предназначенный для
- нахождения локального максимума/минимума нелинейного функционала
- без ограничений.
-
-
- дано ε, x0
- инициализировать Η0
- k = 0
- while ||∇ƒk|| > ε
- найти направление
- pk = -Ck∇ ƒk
- вычислить
- xk+1 = xk + αk pk,
- αk удовлетворяет условиям Вольфе
- обозначить
- sk = xk+1 - xk и
- yk = ∇ ƒk+1 - ∇ ƒk
- вычислить
- Ck+1
- k = k + 1
- end
-
-
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
-
- CRC16/32 - алгоритм нахождения контрольной суммы,
- предназначенный для проверки целостности данных
-
-
- md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
- или дайджестов сообщения произвольной длины и последующей проверки
- их подлинности.
-
-
Потому что он быстрый, компактный и легок в реализации.
-
-
-
Итог
-
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
-
А можете привести сравнение, на сколько быстрее грузится lite версия?
-
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
-
- Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
- подробностями о внутренней работе сервисов.
-
-
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
-
- (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
- Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
- хорошо или плохо работает почта.
-
-
наверное все-таки от 0.5 до 1
-
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
+ Как вы знаете, медиана – это серединное, а не среднее значение в выборке.
+ Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5.
+ В общем случае медиана отлично показывает, сколько грузится средний пользователь.
+
+
+ В случае ускорения или замедления медиана, конечно, изменится. Но она не может
+ рассказать, сколько пользователей ускорилось, а сколько замедлилось.
+
+
+ APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика
+ работает очень просто. Мы выбираем временной интервал [0; t], такой, что если
+ время показа страницы попало в него, то пользователь счастлив. Берем еще один
+ интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница
+ показана за это время, то пользователь в целом удовлетворен скоростью работы,
+ но уже не настолько счастлив. И применяем формулу:
+
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
+
+
Как мы измеряем
+
+ Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять
+ причину замедления: медленнее стал отвечать сервер либо слишком долго
+ выполняется JavaScript. Выглядит это примерно так:
+
+ C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при
+ отправке рассчитываются. На этапах разница между “end” и “start” не считается,
+ а все вычисления производятся в конце:
+
+
var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start'];>
+
И на сервер прилетают подобные записи:
+
serverResponse=50&domUpdate=60
+
+
+
Как мы ускоряем
+
Чтобы снизить время загрузки почты при выходе новых версий,мы уже делаем следующее:
+
+
включаем gzip;
+
выставляем заголовки кэширования;
+
фризим CSS, JS, шаблоны и картинки;
+
используем CDN;
+
+
+ Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой
+ передавать только diff между ней и той, которая сохранена у пользователя?»
+ В браузере же останется просто наложить патч на клиенте.
+
+
+ На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например,
+ RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они
+ не получили должного распространения в браузерах и на серверах.
+
+
+ Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления,
+ начали искать реализации diff на JS. На популярных хостингах кода нашли
+ библиотеки:
+
+
+ - VCDiff
+ - google-diff-patch-match
+
+
Для окончательного выбора библиотеки нам нужно сравнить:
+
+
+
Библиотека
+
IE 9
+
Opera 12
+
+
+
vcdiff
+
8
+
5
+
+
+
google diff
+
1363
+
76
+
+
+
+ После того как мы определились с библиотекой для диффа, нужно определиться с тем,
+ где и как хранить статику на клиенте.
+
+ То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У
+ каждого объекта есть три свойства. k — названия ключа в localStorage для этого
+ ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для
+ ресурса актуальной версии, чтобы потом можно было проверить правильность
+ наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера.
+
+
+ Алгоритм Бройдена — Флетчера — Гольдфарба — Шанн
+ (BFGS)
+ — итерационный метод численной оптимизации, предназначенный для
+ нахождения локального максимума/минимума нелинейного функционала
+ без ограничений.
+
+
+ дано ε, x0
+ инициализировать Η0
+ k = 0
+ while ||∇ƒk|| > ε
+ найти направление
+ pk = -Ck∇ ƒk
+ вычислить
+ xk+1 = xk + αk pk,
+ αk удовлетворяет условиям Вольфе
+ обозначить
+ sk = xk+1 - xk и
+ yk = ∇ ƒk+1 - ∇ ƒk
+ вычислить
+ Ck+1
+ k = k + 1
+ end
+
+
Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде:
+
+ CRC16/32 - алгоритм нахождения контрольной суммы,
+ предназначенный для проверки целостности данных
+
+
+ md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков»
+ или дайджестов сообщения произвольной длины и последующей проверки
+ их подлинности.
+
+
Потому что он быстрый, компактный и легок в реализации.
+
+
+
Итог
+
Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах:
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
+
А можете привести сравнение, на сколько быстрее грузится lite версия?
+
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
+
+ Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
+ подробностями о внутренней работе сервисов.
+
+
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
+
+ (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
+ Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
+ хорошо или плохо работает почта.
+
+
наверное все-таки от 0.5 до 1
+
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
дано ε, x0
инициализировать Η0
k = 0
- while ||∇ƒk|| > ε
+ while ||∇ƒk|| > ε
найти направление
pk = -Ck∇ ƒk
вычислить
From 561a45269bdfa17b44f2d63305436b528daf6401 Mon Sep 17 00:00:00 2001
From: alexanderkine
Date: Thu, 20 Oct 2016 02:15:55 +0600
Subject: [PATCH 17/19] =?UTF-8?q?=D0=A1=D0=B8=D0=BD=D1=82=D0=B0=D0=BA?=
=?UTF-8?q?=D1=81=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B8=D1=81?=
=?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=203?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
index.html | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/index.html b/index.html
index fd9d5a2..65f3b08 100644
--- a/index.html
+++ b/index.html
@@ -202,7 +202,7 @@
Итог
Релиз
-
С патчем
+
С патчем
Без патча
@@ -228,24 +228,24 @@
Итог
Компания: Яндекс
Комментарии (3):
-
- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
+
Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05
А можете привести сравнение, на сколько быстрее грузится lite версия?
-
- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
+
JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30
Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми
подробностями о внутренней работе сервисов.
-
- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
+
Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13
(кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех).
Получается значение от нуля до единицы, которое, видимо, лучше всего показывает,
хорошо или плохо работает почта.
наверное все-таки от 0.5 до 1
-
- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35
+
alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35