转自:http://blog.51cto.com/shuizhongyue/1718327

相似文件:http://www.alloyteam.com/2015/09/explore-performance/

说在前面

最近身体出了点问题,折腾了个把星期总算活过来。差不多个把星期没写博客了,今天分享一个比较好玩的小编—performance

上一篇博客中分享了很多页面性能的测试工具,通常,页面的性能问题也是我们开发中一个重要环节,但一直以来我们也没有没有比较好的手段,来检测页面的性能;通常,我们只能以来与chrome或者FF浏览器自带的profiletimming或者使用在线的pagetest,阿里测等。我们很希望有一套页面性能的api,我们可以自己编写代码测试页面性能而不需要借助于其他的工具。

好在W3C Web性能工作小组已经

与各浏览器厂商都已认识到性能对于web开发的重要性,为了解决当前性能测试的困难,W3C推出了一套性能API标准,各种浏览器对这套标准的支持如今也逐渐成熟起来。这套API的目的是简化开发者对网站性能进行精确分析与控制的过程,方便开发者采取手段提高web性能。


正文

整套标准包含了10余种API,各自针对性能检测的某个方面。在下图中可以看到它们当前在规范流程中的进展:



下面是API描述的功能列表

浏览器支持情况

有两个使我们必须要关注的:

1.页面加载Navigation Timing

2.页面资源加载Timing:Resource Timing

这两个API非常有用,可以帮助我们获取页面的Domready时间、onload时间、白屏时间等,以及单个页面资源在从发送请求到获取到rsponse各阶段的性能参数。

使用这两个API时需要在页面完全加载完成之后才能使用,最简单的办法是在window.onload事件中读取各种数据,因为很多值必须在页面完全加载之后才能得出。


(1)页面加载Navigation Timing

该对象能够帮助网站开发者检测真实用户数据(RUM),例如带宽、延迟或主页的整体页面加载时间。

打开chrome浏览器输入:performance.timing;如下图所示


返回了一个返回的是一个PerformanceTiming对象,包含了各种与浏览器性能有关的时间数据,提供浏览器处理网页各个阶段的耗时,它包含的页面性能属性如下表:


下面有一个图,能更加直观的展示,这些数据直接的关系。

对我们比较有用的页面性能数据大概包括如下几个:

DNS查询耗时、TCP链接耗时、request请求耗时、解析dom树耗时、白屏时间、domready时间、onload时间等,而这些参数是通过上面的performance.timing各个属性的差值组成的,计算方法如下:

DNS查询耗时domainLookupEnd - domainLookupStart

TCP链接耗时connectEnd - connectStart

request请求耗时responseEnd - responseStart

解析dom树耗时domComplete- domInteractive

白屏时间responseStart - navigationStart

domready时间domContentLoadedEventEnd - navigationStart

onload时间loadEventEnd - navigationStart

NavigationTiming的目的是用于分析页面整体性能指标。如果要获取个别资源(例如JS、图片)的性能指标,就需要使用Resource Timing API


Resource Timing API

这个主要用来获取到单个静态资源(Js,CSS,图片,音频视频等等)从开始发出请求到获取响应之间各个阶段的Timing

同理在chrome的console输入performance.getEntries();显示了所有静态资源的数组列表;点开后显示了,某一个请求的相关参数有name,type,时间等等。

这个接口是获取所有的资源;同时,该API还提供了另外另个接口

performance.getEntriesByName()
performance.getEntriesByType()

顾名思义,分别是按资源的名称和类型获取相应的请求数据。


memory:浏览器内存情况

同理输入performance.memory


  1. jsHeapSizeLimit

  2. totalJSHeapSize

  3. usedJSHeapSize

    注:usedJSHeapSize表示所有被使用的js堆栈内存;totalJSHeapSize表示当前js堆栈内存总大小,这表示usedJSHeapSize不能大于totalJSHeapSize,如果大于,有可能出现了内存泄漏


performance.navigation对象

performance还可以提供一些用户行为信息,主要都存放在performance.navigation对象上面。

chrome下如下图:

这个对象有两个属性:

1performance.navigation.type

该属性返回一个整数值,表示网页的加载来源,可能有以下4种情况:

0:网页通过点击链接、地址栏输入、表单提交、脚本操作等方式加载,相当于常 数performance.navigation.TYPE_NAVIGATENEXT

1:网页通过重新加载按钮或者location.reload()方法加载,相当于常 数performance.navigation.TYPE_RELOAD

2:网页通过前进后退按钮加载,相当于常 数performance.navigation.TYPE_BACK_FORWARD

255:任何其他来源的加载,相当于常数performance.navigation.TYPE_UNDEFINED

2performance.navigation.redirectCount

表示当前网页经过了多少次重定向跳转。


最后呢,自己写了一段js来测试了上面的相关参数,代码如下:
(function(w){
	varresultObj={};
	//初始化相关
	functionTestTiming(timing){
		vartimerArr=[];
		vardnsTimer={key:"DNS查询耗时",value:timing.domainLookupEnd-timing.domainLookupStart+"ms"};
		vartcpTimer={key:"TCP链接耗时",value:timing.connectEnd-timing.connectStart+"ms"};
		varrequestTimer={key:"request请求耗时",value:timing.responseEnd-timing.responseStart+"ms"};
		vardomTimer={key:"解析dom树耗时",value:timing.domComplete-timing.domInteractive+"ms"};
		varpageEmptyTimer={key:"白屏时间",value:timing.responseStart-timing.navigationStart+"ms"};
		vardomreadyTimer={key:"domready时间",value:timing.domContentLoadedEventEnd-timing.navigationStart+"ms"};
		varonloadTimer={key:"onload时间",value:timing.loadEventEnd-timing.navigationStart+"ms"};

		timerArr=timerArr.concat(dnsTimer,tcpTimer,requestTimer,domTimer,pageEmptyTimer,domreadyTimer,onloadTimer);
		returntimerArr;
	}
	//请求的各种资源(js,图片,样式等)
	functionTestResource(resourcesObj){
		varresourceArr=[];
		varlen=resourcesObj.length;
		for(vari=len-1;i>0;i--){
			vartemp={};
			varcur=resourcesObj[i];
			temp.key=cur.name;
			temp.resValue=cur.responseEnd-cur.requestStart+"ms";
			temp.conValue=cur.connectEnd-cur.connectStart+"ms";
			resourceArr.push(temp);
		}
		returnresourceArr;
	}
	//页面的加载方式
	functionpageLoadMethod(type){
		vararr=[];
		varloadMethod={};
		loadMethod.name="进入页面的方式";
		varstr="";
		switch(type){
			case0:
				str='点击链接、地址栏输入、表单提交、脚本操作等方式加载';
				break;
			case1:
				str='通过“重新加载”按钮或者location.reload()方法加载';
				break;
			case2:
				str='网页通过“前进”或“后退”按钮加载';
				break;
			default:
				str='任何其他来源的加载';
				break;
		}
		loadMethod.value=str;
		arr.push(loadMethod);
		returnarr;
	}
	//输出性能数据
	functionoutPutData(perObj){
		vartimerArr=TestTiming(perObj.timing);
		varresourcesArr=TestResource(perObj.getEntries());
		varloadMethodArr=pageLoadMethod(perObj.navigation.type);
		console.log("-------页面初始化------------------------");
		console.table(timerArr);
		console.log("-------页面请求------------------------");
		console.table(resourcesArr);
		console.log("-------页面加载方式------------------------");
		console.table(loadMethodArr);
	}

	w.perTestResult=outPutData;
})(window);

说在最后

相关资料

1 http://segmentfault.com/a/1190000004010453

2 https://github.com/fredshare/blog/issues/5

3 http://javascript.ruanyifeng.com/bom/performance.html#toc5

使用window.performance分析web前端性能的更多相关文章

  1. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  2. Xamarin可以用来制作iOS,Android和WEB应用吗?

    Xamarin旨在通过在C#中编码来创建原生iOS,Android和Windows应用程序.但它还可以生成一个网络应用程序吗?如果没有,是否有一些解决方案可以让我们这样做?解决方法您可以在PCL库中编写后端代码,这些代码可以在您的移动应用程序和您的网站之间共享.但是,网络前端需要与移动前端分开编写.

  3. ios – 我可以使用哪些iPhone OS API来实现类似于iBook页面翻转过渡的过渡动画?

    >UIKitAPI中的某个地方是否可以使用该动画,还是我必须自己实现?它肯定有3D感觉,他们可以使用OpenGLESAPI吗?解决方法Apple当然使用OpenGLES来实现它.Apple使用的实际API是私有的,但thisblogger具有示例代码的实现的开始.

  4. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  5. 我应该使用哪个高级API来管理iOS上的UDP套接字?

    在“NetworkProgrammingTopicsConceptualGuide”的“UsingSocketsandStreams”一章中,Apple说:Note:POSIXnetworkingdoesnotactivatethecellularradiooniOS.Forthisreason,thePOSIXnetworkingAPIisgenerallydiscouragediniOS.同样

  6. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  7. ios – 尝试向我们分配IP而不是localhost或home时,NSURLSession失败

    我有一台本地运行的服务器(我的IP是192.168.0.98),并且已经尝试使用一些网络代码来访问它.最初这是通过AFNetworking完成的,但我现在用这样的NSURLSession完成了它:然后我用这3个URL运行它:>http://localhost:8080/api–>作品.>http://127.0.0.1:8080/api–>作品.>http://192.168.0.98:8080/

  8. 适用于iOS的Google云端硬盘实时API

    我想使用GoogleDrive和新的实时API在我的iOS应用中实现实时协作.我知道我可以在Objective-C中设置一个Web视图,并在Web视图和我的本机应用程序之间建立双向通信,因此使用javascript库,但我担心这对于高容量来说效率低下数据流量.我希望可能会有一个原生的解决方案即将出现.有关Objective-C的GoogleApi客户端库是否会更新以包含Google云端硬盘实时API的任何消息?

  9. ios – 如何通过iPhone中的Graph API在Facebook上“喜欢”和“评论”?

    我正在使用图形api显示新闻源.我对以下问题有疑问.>我想为每个新闻提要帖子提供“赞”功能.>我想为每个新闻提要帖子提供“评论”功能.有人可以帮助我如何使用iPhone中的图形API来解决这个问题.解决方法请参考我的答案:HowtocommentorlikeaphotoinfacebookthroughFBconnectorGraphAPIiniPhoneSDK?只需将您的访问令牌发送到https

  10. ios – 使用带有OAuth 2.0的Google API在iPhone中登录Gmail

    我找到了Google提供的服务,可以访问各种Google服务的GoogleApi.我可以在iPhone中设置一个项目,并为iOS应用程序和本机应用程序创建API访问.我想为我的iPhone应用程序使用本机API.它API为我提供了电子邮件,全名,名字,姓氏,google_id,性别,dob,profile_image.如何在我的iPhone应用程序,任何示例应用程序,可用的代码段中使用这些?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部