Статьи Доклады с конференций

Автор: Николай Мациевский aka sunnybear
Презентация в .ppt

Web Performance: от идеи к стандарту

Сейчас мы являемся свидетелями уникального явления: накопленный опыт, практики использования и проблемы веб-производительности обретают некоторую законченную форму в виде стандарта от W3C. Это стандарт Web Performance, над которым работает выделенная, недавно созданная группа.

Но начнем сначала.

Вчера: немного истории

На заре Интернета, в прошлом веке, проблемы производительности веб-сайтов не было, были проблемы медленного Интернет-соединения (потому что страницы начала века выглядят почти идеально с точки зрения текущих практик высокой производительности). Обычная страница представляла собой несколько (часто не больше 5) файлов, из которых текстовых файлов было 1-2. Лучшей практикой увеличения скорости загрузки было gzip-сжатие, но в силу слабой поддержки со стороны браузеров оно применялось редко.

Чуть позже, уже в нашем веке, с развитием технологий и стандартов, проблема «медленных» стала проявляться больше. На странице уже было несколько файлов стилей и скриптов, браузеры не умели эффективно их загружать, были разработаны все основные техники оптимизации, но до широкой общественности пока не дошли.

И на том фоне Yahoo! в 2007 году выкладывают свои советы по производительности и дополнение YSlow. Это было равносильно взрыву, о веб-производительности заговорили все. Появилась Net Panel в Firebug, появился Web Inspector в Safari в 2008 году, а в следующем году появился dynaTrace для IE и Speed Tracer.

На фоне этого бума летом 2010 года была образована отдельная группа W3C, занимающаяся разработкой соответствующих стандартов.

Сегодня: получение данных

Почему же возникла необходимость в создание такой группы? Ведь уже есть инструменты для анализа производительности и практики создания быстрых сайтов. Во-первых, сейчас достаточно сложно получить информации о производительности страницы «в общем виде». Каждый из браузеров имеет собственное API (позволяющее через JavaScript получить доступ к C-данным), но экспорт всех значений кроссбраузерно очень сложен.

Во-вторых, доступный набор значений, которые тоже не так просто получить (ниже приведен пример получения времени onLoad, наиболее простого из всех), крайне ограничен. Сказать по нему что-то конкретное о производительности сайта сложно.

<html>
	<head>
		<script type="text/javascript">
		var start = (new Date).getTime();
		</script>
	</head>
	<body>
		<script type="text/javascript">
		window.onload = function() {
			pageLoad = (new Date).getTime() - start;
		};
		</script>
	</body>
</html>

В-третьих, существует масса дополнительных, околопроизводительных возможностей и интерфейсов, которые не везде можно получить, которые кое-где невозможно получить (например, времена загрузки в Opera), и поддержка которых желательна (например, формат HAR для переноса данных о времени загрузки страницы и ее составных частей).

Завтра: стандарт Web Performance

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

A           B C                             D  E F     G      H     I      J   K      L  
|           | | |-dns-|-conn-|-req-|-resp-| |  | |-dns-|-conn-|-req-|-resp-|   |     |
|  |-unload-| |--------fetch foo.com--------|  |--------fetch bar.com--------| |-load-|
|-------------------------------end user latency----------------------------------------|

A navigationStart
B unloadEventEnd
C redirectStart
D redirectEnd
E fetchStart
F domainLookupStart
G domainLookupEnd+connectStart
H connectEnd+requestStart
I requestEnd+responseStart
J responseEnd
K loadEventStart
L loadEventEnd

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

  • Сетевые задержки. Все, что происходит между браузером и сервером, может быть затем получено на уровне JavaScript в виде понятных таймингов.
  • Обработка информации, например, в рендеринге и поведении пользователей в интерфейсах. Сейчас рендеринг никак, кроме специализированных инструментов, не замерить.
  • Детальная производительность JavaScript. Сейчас она может быть измерена (в общем виде), но с недостаточной точностью. Планируется и здесь ввести повышенную детализацию.

Когда все это планиуется выпустить? Прямо сейчас идет обсуждение стандарта выдачи информации о сетевых задержках, и осенью будут выложены первые результаты. Весной обсуждение большинства вещей уже планируется завершить и выложить публичный стандарт. Финализирован он будет через год. Замечательно, что прямо на наших глазах происходит обобщение существующего опыта веб-разработки в официальный стандарт, и происходит достаточно быстро.

Часть вещей уже в браузерах реализовано, это IE9 Preview (такой объект как window.msPerformance и его свойства ResourceTiming, requestCount, domainCount) и ночных сборки WebKit. Поэтому скорее всего, к 2012 году мы получим рабочую модель для повседневного использования.

Это открывает поистине огромные возможности для анализа производительности (собирая статистику через единое API во всех браузерах) и более удобного, подстраивающегося поведения сайтов под не только браузеры, но и мощности компьютеров и ширину каналов пользователей. Например, мы можем менять количество графики и виджетов на сайте. Мы можем переключать загрузку сайта динамически на более быстрый узел, основываясь на показателях задержек. Возможна также предзагрузке и постзагрузка «тяжелого» содержания.

Это отлично, но все ли так гладко? Существует ряд проблем уже в текущей концепции стандарта. Например, проблема безопасности доступа к данным о закэшированному содержанию сайтов: ведь по нему можно будет вычислить историю посещений пользователей. Или падение производительности в связи с «эффектом наблюдателя». Или различные уровни использования сетевой инфрасруктуры Microsoft и остальными браузерами. Но их все предполагается так или иначе решить и выпустить стандарт с учетом всех возможных подводных камней.

Спасибо за внимание. Вопросы?

Все комментарии (habrahabr.ru)