Измерение времени загрузки сайта через API производительности - PullRequest
4 голосов
/ 30 сентября 2011

Я слушал выступление Стива Соудерса несколько дней назад, и он упомянул новую спецификацию производительности, которую реализуют новые браузеры, и это было довольно интригующе. В своем выступлении он упомянул следующий пример как средство измерения воспринимаемого времени загрузки страницы:

var timing = performance.timing;
var loadtime = timing.loadEventEnd - timing.navigationStart;
alert("Perceived time:"+loadtime);

Ясно, что это базовый пример, но, пробуя его в моей среде разработки, я получаю сумасшедшие числа, такие как -1238981729837, потому что loadEventEnd <0. </p>

Очевидно, что что-то не так, и есть много улучшений, которые можно внести в этот пример, чтобы дать больше информации и повысить надежность. (Я знаю, что это реализовано только в нескольких браузерах).

Итак, каковы некоторые рекомендации по использованию этого API для отслеживания времени загрузки страницы через Javascript для анализа производительности моего сайта?

Ответы [ 3 ]

19 голосов
/ 15 июня 2012

Вам нужно измерить loadEventEnd после завершения события onload, иначе оно будет сообщено как 0, как никогда не происходило.(пример jquery для присоединения к событию onload)

$(window).load(function(){
 setTimeout(function(){
 window.performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};
 var timing = performance.timing || {};
 var parseTime = timing.loadEventEnd - timing.responseEnd;
 console.log('Parsetime: ', parseTime);
 }, 0);
});
9 голосов
/ 30 сентября 2011

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

, это хорошие цифры для размера страниц и их ресурсов-

/4383592/izmerenie-vremeni-zagruzki-saita-cherez-api-proizvoditelnosti
Friday, September 30, 2011 4:03:52 AM
//
(timestamp:1317369511747)
navigationStart= 0 milliseconds elapsed 

//
fetchStart= 0
domainLookupStart= 0
domainLookupEnd= 0
requestStart= 0
//
responseStart= 359
responseEnd= 359
domLoading= 359
//
unloadEventStart= 375
unloadEventEnd= 375
//
domInteractive= 515
domContentLoadedEventStart= 515
//
domContentLoadedEventEnd= 531
//
domComplete= 2496
loadEventStart= 2496
//
(timestamp:1317369514243)
loadEventEnd= 2496 milliseconds elapsed 

http://www.yankeeweb.com/webshop.html
Friday, September 30, 2011 4:22:25 AM
//
(timestamp:1317370911738)
navigationStart= 0 milliseconds elapsed 

//
fetchStart= 0
domainLookupStart= 0
//
domainLookupEnd= 281
connectStart= 281
//
connectEnd= 296
requestStart= 296
//
responseStart= 546
//
responseEnd= 562
domLoading= 562
//
domInteractive= 1264
domContentLoadedEventStart= 1264
domContentLoadedEventEnd= 1264
//
domComplete= 1622
loadEventStart= 1622
//
(timestamp:1317370913360)
loadEventEnd= 1622 milliseconds elapsed 

То, что вам действительно нужно, это числа, которые другие люди получают при посещении вашего сайта - вы можете включить его в анкету или почтовую рассылку (пока из firefox 7 и chrome.)1010 *

// код, запущенный в блокноте Firefox:

(function(){
    if(!window.performance || !performance.timing) return;
    var timestamp, first, hstr, L,

    ptA= ['navigationStart', 'unloadEventStart', 'unloadEventEnd', 'redirectStart',
    'redirectEnd', 'fetchStart', 'domainLookupStart', 'domainLookupEnd', 'connectStart',
    'connectEnd', 'secureConnectionStart', 'requestStart', 'responseStart', 'responseEnd',
    'domLoading', 'domInteractive', 'domContentLoadedEventStart',
    'domContentLoadedEventEnd', 'domComplete', 'loadEventStart',
    'loadEventEnd'].map(function(itm){
        timestamp= performance.timing[itm];
        if(isFinite(timestamp) && timestamp!== 0){
            if(!first) first= timestamp;
            return [itm, timestamp, timestamp-first];
        }
        else return [1, NaN];
    }).filter(function(itm){
        return !isNaN(itm[1]);
    });
    ptA= ptA.sort(function(a, b){
        return a[1]-b[1];
    });
    if(report=== 1) return ptA;
    L= ptA.length-1;
    ptA= ptA.map(function(itm, i){
        if(i> 0 && ptA[i-1][2]!== itm[2]) itm[0]= '//\n'+itm[0];
        if(i=== 0 || i=== L){
            itm[0]= '//\n(timestamp:'+itm[1]+ ')\n'+itm[0];
            itm[2]+= ' milliseconds elapsed \n';
        }
        return itm[0]+'= '+itm[2];
    });
    hstr= '\n'+location.href+'\n'+ new Date().toLocaleString()+'\n';
    return hstr+ptA.join('\n');
})()
4 голосов
/ 06 июля 2012

Хороший ответ от Ionut Popa.

сумасшедшие числа, такие как -1238981729837 в качестве ответа, поскольку loadEventEnd <0 </p>

loadEventEnd не меньше нуля, это равно нулю.

Как указывает время навигации spec : «Этот атрибут должен возвращать время, когда событие загрузки текущего документа завершено.Он должен возвращать ноль, когда событие загрузки не запущено или не завершено. '

Следовательно, timing.loadEventEnd - timing.navigationStart будет отрицательным.

FWIW, вот не-jQuery версия:

window.onload = function(){
  setTimeout(function(){
    var t = performance.timing;
    console.log(t.loadEventEnd - t.responseEnd);
  }, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...