_gaq.push(['_trackPageLoadTime'])是如何工作的?

102

谷歌分析的网站速度功能 _gaq.push(['_trackPageLoadTime']) 是如何工作的?是否有关于它是如何工作的文档?


2
@stuken.yuri 这是Google Analytics异步调用的语法。它基本上意味着:将函数(名称)_trackPageLoadTime添加到队列中,然后在ga.js加载完成后按顺序依次触发该队列中的所有函数。这样可以安全地异步加载ga.js - Yahel
1个回答

181
编辑:截至2011年11月16日,_trackPageLoadTime函数已被弃用,并将其功能设置为默认设置。(从功能上讲,它已经从选择性功能变成了选择退出功能。) _setSiteSpeedSampleRate是设置此功能的采样率的新函数;其默认值为1(即1%)。要选择退出使用站点速度功能,您必须向此函数传递0
_gaq.push(["_setSiteSpeedSampleRate", 0]);

来自Google Analytics帮助中心

该报告目前支持以下浏览器:Chrome、Internet Explorer 9和安装有Google工具栏的先前版本的Internet Explorer。更具体地说,网站速度报告需要支持HTML5 NavigationTiming接口或安装了Google Internet Explorer工具栏的浏览器。

因此,它不像许多以前的家庭解决方案那样实现自己的计时器来计算页面加载所需的时间。相反,它使用一种新的HTML5功能,目前仅在上述列出的情况下受支持,称为NavigationTiming。

编辑:现在Firefox 7也支持此功能。

(重要的是要注意它不会在每次加载时都运行;相反,它目前对大约2%的页面浏览量进行采样,尽管它配置为尝试跟踪10%的访问中的所有页面加载;随着越来越多的浏览器支持NavigationTiming API,您可以期望总采样百分比开始接近10%。)

这个接口可以通过DOM对象window.performance(或在早期版本的Chrome中,window.webkitPerformance)访问,使用timing属性(因此是window.performance.timing)。该对象存储了所有关键页面加载事件时间的测量值,而Google Analytics会减去其中2个更重要的外部值来判断页面加载速度。
对于未缓存的Mashable.com加载,在Chrome 11中它所测量的例子如下:
timing = {
  connectEnd: 1306677079337,
  connectStart: 1306677079337,
  domComplete: 1306677083482,
  domContentLoadedEventEnd: 1306677081765,
  domContentLoadedEventStart: 1306677081576,
  domInteractive: 1306677081576,
  domLoading: 1306677079478,
  domainLookupEnd: 1306677079337,
  domainLookupStart: 1306677079337,
  fetchStart: 1306677079337,
  loadEventEnd: 1306677083483,
  loadEventStart: 1306677083482,
  navigationStart: 1306677079337,
  redirectEnd: 0,
  redirectStart: 0,
  requestStart: 1306677079394,
  responseEnd: 1306677079669,
  responseStart: 1306677079476,
  secureConnectionStart: 0,
  unloadEventEnd: 0,
  unloadEventStart: 0
}

那些数字是纪元毫秒数,或自1970年1月1日以来的毫秒数。我没有看到任何文档说明它们减去哪些值来生成它们的值,但从对ga.js的粗略检查,看起来它是 loadEventStart-fetchStart:
h&&h[c]!=k&&h.isValidLoadTime?b=h[c]:e&&e[a]&&(b=e[a].loadEventStart-e[a].fetchStart);

对于上面的示例,这意味着它会在_trackPageLoadTime调用中记录4.14秒
从W3C Navigation Timing规范中可以看到:

fetchStart属性

如果要使用HTTP GET或等效方式获取新资源,则fetchStart必须返回用户代理开始检查任何相关应用程序缓存之前的时间。否则,它必须在用户代理开始获取资源时返回时间。

loadEventStart属性

此属性必须在当前文档的加载事件触发之前立即返回时间。当尚未触发加载事件时,它必须返回零。

对于好奇的人,顺序似乎如下所示:

connectStart、connectEnd、domainLookupStart、domainLookupEnd、fetchStart、navigationStart、requestStart、responseStart、domLoading、responseEnd、domContentLoadedEventStart、domInteractive、domContentLoadedEventEnd、domComplete、loadEventStart、loadEventEnd

对于列出的0值:

unloadEventStartunloadEventStart显示了上一个页面卸载的时间(但仅当该页面与当前页面具有相同的源时)。

redirectEndredirectStart测量了在页面加载链中存在HTTP重定向时添加的延迟。

secureConnectionStart似乎是一种可选的测量SSL连接时间的方法。


6
你真的很棒,非常感谢你提供如此详细的回复。 - Sid
secureConnectionStart是一个标准的测量指标,但浏览器(或任何处理内容的程序)报告该指标是可选的。http://w3c-test.org/webperf/specs/NavigationTiming/#nt-secure-connect-start - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接