`
mutongwu
  • 浏览: 448634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

performance的资源计时统计

阅读更多
以下内容原文来自:
http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/
http://www.stevesouders.com/blog/2014/11/25/serious-confusion-with-resource-timing/

按照自己的理解,做了整理。

一、基本定义:
1. 示例图:




2. 各个时间段的获取:
	// Navigation Timing
	var t = performance.timing,
	    pageloadtime = t.loadEventStart - t.navigationStart,
	    dns = t.domainLookupEnd - t.domainLookupStart,
	    tcp = t.connectEnd - t.connectStart,
	    ttfb = t.responseStart - t.navigationStart;

	// Resource Timing
	var r0 = performance.getEntriesByType("resource")[0],
	    loadtime = r0.duration,
	    dns = r0.domainLookupEnd - r0.domainLookupStart,
	    tcp = r0.connectEnd - r0.connectStart,
	    ttfb = r0.responseStart - r0.startTime;

3. 使用 getEntriesByType(“resource”) 而不是 getEntries().

getEntries 理论上可以有4种不同类型的返回: “resource”, “navigation”, “mark”, and “measure”。
尽管在当前浏览器的实现中,getEntriesByType(“resource”) 与 getEntries 是暂时一致的。
但为了安全起见,使用前者总是明确的。

4.注意secureConnectionStart不同取值:

    1)undefined: IE浏览器下,该值不可用。见:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383630(v=vs.85).aspx
    2)0: HTTP协议下;
    3)有值(时间戳): HTTPS协议下。(与页面本身是否采用HTTPS协议无关。)

    因此,在使用该属性时候,记得先检查是否有值。例如:
    	var r0 = performance.getEntriesByType("resource")[0];
		if ( r0.secureConnectionStart ) {
		    var ssl = r0.connectEnd - r0.secureConnectionStart;
		}


二、跨域的问题
受同源策略影响,跨域资源获取到的时间点,通常为0.包括以下属性:
    redirectStart
    redirectEnd
    domainLookupStart
    domainLookupEnd
    connectStart
    connectEnd
    secureConnectionStart
    requestStart
    responseStart

    解决的方式是:
    资源响应头,添加  Timing-Allow-Origin 的配置。例如:Timing-Allow-Origin:*
    例如:
http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js

所以,测量时间时候,最好是加个判断:
		// Resource Timing
		var r0 = performance.getEntriesByType("resource")[0],
		    loadtime = r0.duration;
		if ( r0.requestStart ) {
		    var dns = r0.domainLookupEnd - r0.domainLookupStart,
		        tcp = r0.connectEnd - r0.connectStart,
		        ttfb = r0.responseStart - r0.startTime;
		}
		if ( r0.secureConnectionStart ) {
		    var ssl = r0.connectEnd - r0.secureConnectionStart;
		}


三、耗时为零是怎么回事?

1. 由于浏览器会缓存域名的解析,所以, domainLookupStart - domainLookupEnd 很有可能为0.
2. TCP链接是可以重用的(通常服务器和浏览器之间,可以同时保留6左右的活跃链接,具体视情况而定),
所以,connectEnd – connectStart 也有可能为0。同样的,适用于 connectEnd – secureConnectionStart = 0 的情况。

四、304响应的问题

Chrome v36还有IE10/11,当一个跨域资源(已经设置Timing-Allow-Origin)被下载后,如果重新刷新页面,由于浏览器缓存策略,这些资源有可能会返回304响应。
但是,这一次的304响应,浏览器无法正确获得缓存的Timing-Allow-Origin头部设置,从而把它认作“非法”的请求,导致出现前面提到的跨域限制,各个时间点时间为0的情况。
显然,这就导影响了测量值的准确性,得到的时延结果,有可能更高(把304视为200)或更低(把304忽略掉)。


五、最后,duration = responseEnd - redirectStart 得到的结果,有可能不是正确的。为什么?
通过浏览器测试发现,实际情况是: duration = responseEnd - redirectStart + 资源阻塞时间。
所谓 资源阻塞时间,这里指的是,由于浏览器的并发请求是有限的,通常是6~12个,在浏览器开始解析标签(如IMG),并发起请求开始,计时就已经开始了。
而在并发之外,处于等待状态的资源,得到的duration就需要比前面的资源,多出了这个阻塞(排队)的时间。从而,这个duration,就不能很好的测量浏览器到服务器直接的请求了。

示例:http://stevesouders.com/tests/rt-blocking.php  在这个页面中,会发现后面的图片加载,比前面的图片加载,要多出1~2s的时间,而这个时间,就是资源在浏览器排队阻塞的时间了。

六:可以顺便关注一下这个统计脚本:boomerang

https://github.com/lognormal/boomerang
前身是Yahoo出的,它有个插件:https://github.com/lognormal/boomerang/blob/master/plugins/restiming.js,
就基本帮我们完成一些时间点的收集功能。

附录:

测试例子:http://stevesouders.com/tests/tao.php

原文:http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/
 http://www.stevesouders.com/blog/2014/11/25/serious-confusion-with-resource-timing/
  • 大小: 34 KB
0
0
分享到:
评论

相关推荐

    oracle公司厂商EHR解决方案.pptx

    Oracle的集成式企业级学习平台为企业提供课程设计、排程、注册管理、审批、进度追踪、学员反馈统计与分析等功能,使培训管理成为闭环式人力资源管理的一部分,与绩效管理和员工发展紧密结合。这个平台有助于快速、...

    MySQL全量SQL分析与审计平台.pdf

    它通过收集和存储关于服务器内部事件和等待事件的数据,帮助管理员深入了解SQL语句的执行情况和资源消耗。Performance Schema包含了一系列的表,例如: 1. setup_instruments:定义了可被追踪的事件类型,如SQL语句...

    KPI指标入门.ppt

    原始统计分为几种类型,如计数器型、计量器型、计时器型、计数器组型、常规分布型和加权分布型。这些统计项用于计算关键指标,以反映网络的性能和负荷。 网络性能的KPI主要包括接续顺畅度、通话流畅度、掉话率、...

    性能验证工具,可以查看到每个子函数的时间消耗情况

    perf提供了一种简单的方式来收集和分析各种性能数据,包括CPU周期、指令执行、缓存命中率等,以及用户空间和内核空间的函数调用计时。它可以通过采样技术来监控进程,线程,甚至是特定的指令,以了解程序运行时的...

    第二章 算法分析 程序性能.doc

    2. **使用操作数和执行步数来测量程序的时间需求**:这是一种量化程序运行时间的方法,通过统计基本操作的数量来估算程序的整体运行时间。 #### 二、渐进符号描述复杂性 - **Ο(大O符号)**:表示最坏情况下的...

    appmetrics:Node Application Metrics提供了一个基础架构,用于为基于Node.js的应用程序收集资源和性能监视数据

    节点应用程序度量标准提供了以下内置数据收集源: 资源描述环境机器和运行时环境信息中央处理器进程和系统CPU 记忆进程和系统内存使用GC Node / V8垃圾回收统计事件循环事件循环延迟信息循环事件循环计时指标功能分

    前端项目-benchmark.zip

    "前端项目-benchmark.zip"正是这样一款专为前端开发者设计的基准测试库,它提供了高分辨率的计时器,能够帮助我们得到统计显著的结果,从而做出更明智的优化决策。 首先,我们来了解一下什么是基准测试。基准测试是...

    一个计算流量的c#作业

    6. **计时器(Timer)**: 使用`System.Timers.Timer`或`System.Threading.Timer`可以定时检查并记录流量数据,比如每秒或每分钟统计一次。 7. **性能计数器(Performance Counter)**: .NET框架提供了`System....

    sipp 文档 教程

    SIPP(Simple IP Performance Protocol)是一个强大的、开源的SIP(Session Initiation Protocol)负载生成器和基准测试工具。它被广泛用于测试SIP服务器、代理和客户端的性能、稳定性和容量。SIP是一种互联网协议,...

    js网页打字速度测试

    可以使用`Date.now()`或`performance.now()`来获取当前时间戳,并将其与上一次按键的时间戳做差值,得到两次按键之间的间隔。累积这些间隔,就能得到总打字时间。 计算打字速度通常是将字符数量除以总时间,单位...

    unix power tools 3ed.pdf

    **5.4 系统性能和性能分析 (Chapter 26: System Performance and Profiling)** - **性能监控**: 使用`top`, `vmstat`等命令监控系统性能。 - **性能分析**: 使用`gprof`, `perf`等工具进行性能分析。 - **调优**: ...

Global site tag (gtag.js) - Google Analytics