Navigation Timing API — средство для выявления источников тормозов на проекте.
Как это работает?
Время загрузки страницы складывается из 3-х составляющих:
1. Время запроса от клиента к серверу (проблемы со связью?)
2. Возврат результатов обработки клиенту (сервак тупит?)
3. Рендеринг страницы (слабый клиент или много плагинов и прочего js?)
Внятного механизма получения значений времени, которое тратится на каждый из шагов раньше не было. Navigation Timing API как раз даёт возможность без труда определить это время на клиенте. В действительности, оно позволяет узнать даже больше (подробные описания таймингов есть у ):

Получить тайминги (timestamps) из браузера можно, используя
interface PerformanceTiming {
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
};
Зачем это нужно?
Пример: пользователи стали жаловаться, что страницы грузятся долго. Добиться чего-то более внятного, чем просто “долго”, невозможно, поэтому появилось такое решение:
window.onload = function(){
checkTimings();
if (tempOnLoad){
tempOnLoad(); //возвращаем битриксовые обработчики
}
}
function checkTimings(){
var temp = new Object();
for (var o in performance.timing){ /*костыль из-за различий между FF,IE и Chrome в понимании того, что же есть performance.timing*/
if (o == 'msFirstPaint') { //исключим специфику IE
continue;
}
temp[o] = performance.timing[o];
}
temp['secureConnectionStart'] = (temp['secureConnectionStart']) ? temp['secureConnectionStart'] : 0; // фикс для FF
temp.currentTime = Math.round(new Date().getTime());
temp.currentURL = window.location.href;
temp.serverName = window.location.hostname;
var target = 'http://targetfile.php?time='+encodeURIComponent(JSON.stringify(temp));
var request = createCORSRequest('POST', target);
request.send();
}
Что делать там с данными — уж кто как хочет. Наш вариант — график зависимости время загрузки от времени, когда данные были сняты с возможностью детального просмотра таймингов по каждому событию.
Где это работает?

Полезные ссылки
1.
2.
3.
4.
Как это работает?
Время загрузки страницы складывается из 3-х составляющих:
1. Время запроса от клиента к серверу (проблемы со связью?)
2. Возврат результатов обработки клиенту (сервак тупит?)
3. Рендеринг страницы (слабый клиент или много плагинов и прочего js?)
Внятного механизма получения значений времени, которое тратится на каждый из шагов раньше не было. Navigation Timing API как раз даёт возможность без труда определить это время на клиенте. В действительности, оно позволяет узнать даже больше (подробные описания таймингов есть у ):
Получить тайминги (timestamps) из браузера можно, используя
interface PerformanceTiming {
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
readonly attribute unsigned long long;
};
Зачем это нужно?
Пример: пользователи стали жаловаться, что страницы грузятся долго. Добиться чего-то более внятного, чем просто “долго”, невозможно, поэтому появилось такое решение:
- Добавляем в шапку код, который сдирает данные из структуры выше + добавляем к ним время, когда страница окончательно собрана.
- По вкусу добавляем к структуре имя пользователя, браузер, имя проекта.
- Пакуем всё это дело, шлём на сервер. Примерно так:
window.onload = function(){
checkTimings();
if (tempOnLoad){
tempOnLoad(); //возвращаем битриксовые обработчики
}
}
function checkTimings(){
var temp = new Object();
for (var o in performance.timing){ /*костыль из-за различий между FF,IE и Chrome в понимании того, что же есть performance.timing*/
if (o == 'msFirstPaint') { //исключим специфику IE
continue;
}
temp[o] = performance.timing[o];
}
temp['secureConnectionStart'] = (temp['secureConnectionStart']) ? temp['secureConnectionStart'] : 0; // фикс для FF
temp.currentTime = Math.round(new Date().getTime());
temp.currentURL = window.location.href;
temp.serverName = window.location.hostname;
var target = 'http://targetfile.php?time='+encodeURIComponent(JSON.stringify(temp));
var request = createCORSRequest('POST', target);
request.send();
}
Что делать там с данными — уж кто как хочет. Наш вариант — график зависимости время загрузки от времени, когда данные были сняты с возможностью детального просмотра таймингов по каждому событию.
Где это работает?
Полезные ссылки
1.
2.
3.
4.