简体   繁体   English

通过性能API测量现场负载时间

[英]Measuring Site Load Times via performance api

I listened to a talk by Steve Souders a few days ago and he mentioned the new performance spec that newer browsers are implementing and it was pretty intriguing. 几天前我听了Steve Souders的演讲,他提到了新浏览器正在实施的新性能规范,这非常有趣。 In his speech he mentioned the following example as a means of measuring perceived page load time: 在他的演讲中,他提到以下示例作为衡量感知页面加载时间的方法:

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

Clearly this is a basic example, but when trying it on my development environment, I get crazy numbers like -1238981729837 as the answer because loadEventEnd is < 0. 显然这是一个基本的例子,但是当我在我的开发环境中尝试它时,我会得到像-1238981729837这样的疯狂数字,因为loadEventEnd <0。

Obviously something is amiss and there are many improvements that can be made to this example to give more information and produce a greater reliability. 显然有些不对劲,可以通过这个例子进行许多改进,以提供更多信息并提高可靠性。 (I am aware this is only implemented in a few browsers). (我知道这只在少数浏览器中实现)。

So, what are some suggestions on how to use this api to track page load times via Javascript for analysis of my site performance? 那么,有什么建议如何使用这个api通过Javascript跟踪页面加载时间来分析我的网站性能?

You need to measure the loadEventEnd after the onload event has finished or else it will be reported as 0, as never happened. 您需要在onload事件完成后测量loadEventEnd,否则将报告为0,因为从未发生过。 (jquery example for attaching to the onload event) (附加到onload事件的jquery示例)

$(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);
});

I have had no trouble using it, but I haven't tried measuring performance on a local machine- it works fine on a website. 我没有使用它,但我没有尝试在本地机器上测量性能 - 它在网站上运行良好。 It is interesting to look at other sites, to have something to compare your numbers with. 看看其他网站是有趣的,有一些东西可以比较你的数字。

for instance, these are good numbers for the size of the pages and their resources- 例如,这些是页面大小及其资源的良好数字 -

http://stackoverflow.com/questions/7606972/measuring-site-load-times-
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 

What you really need are the numbers other people get when visiting your site- you could include it in a form questionaire or mailing, (from firefox 7 and chrome, so far.) 你真正需要的是其他人在访问你的网站时获得的数字 - 你可以将它包含在表单问卷或邮件中(从目前为止来自firefox 7和chrome)。

// code run in firefox scratchpad: //代码在firefox scratchpad中运行:

(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');
})()

Good answer from Ionut Popa. Ionut Popa的回答很好。

crazy numbers like -1238981729837 as the answer because loadEventEnd is < 0 疯狂的数字像-1238981729837作为答案因为loadEventEnd <0

loadEventEnd is not less than zero, it is zero. loadEventEnd不小于零,这零。

As the Navigation Timing spec states: 'This attribute must return the time when the load event of the current document is completed. 正如导航计时规范所述:'此属性必须返回当前文档的加载事件完成时的时间。 It must return zero when the load event is not fired or is not completed.' 当load事件未触发或未完成时,它必须返回零。

Therefore timing.loadEventEnd - timing.navigationStart will be negative. 因此, timing.loadEventEnd - timing.navigationStart将为负数。

FWIW, here's a non-jQuery version: FWIW,这是一个非jQuery版本:

window.onload = function(){
  setTimeout(function(){
    var t = performance.timing;
    console.log(t.loadEventEnd - t.responseEnd);
  }, 0);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM