在前端开发的过程中,掌握好浏览器的特性进行有针对性的性能调优是一项基本工作,jsperf.com是一个用来发布基于HTML的针对性能比较的测试用例的网站,你可以在jsPerf上在线填写和运行测试用例,得到浏览器运行测试用例的性能,学会利用jsPerf会让你的优化工作事半功倍。

书写测试用例

我想写一个简单的例子,验证一个算法是否更高效,这里我想到了字符串的拼接。在JS里拼接大量字符串有两种常见的方法,一是直接用加号(+)连接所有的字符串,二是用数组的join函数拼接起来。在很多书中都提到采用第二种方法的效率更高,那么我们就用jsPerf来验证一下。

第一步,打开jsPerf(http://jsperf.com),在Test case details区域填入测试的基本信息,测试的名称(Title)、短名称(Slug),Slug用于生成将来的测试页面的地址,所以不能与现有的重复。然后你可以选择是否马上发布(Published),在Description区域填入测试的目的和方法之类的描述。

第二步就是写测试用例了。我准备为这两个算法各写一个测试用例(test case),而这两个例子都需要一个很大的字符串数组作为输入,这时你需要在Preparation code区域准备好这个数组,在"Define setup for all tests"区域填入如下代码,会为我生成这样一个大字符串数组。下面是生成数组的代码:

1 var bigArray = [];
2 for (var i = 0; i < 1000; i++) {
3     bigArray.push('This is a test!test!test!');
4 }

你也可以在Define teardown for all tests区域执行一些JS代码,清除运行测试用例产生的DOM结点、JS变量等等,以免影响到再次运行测试用例。

除了准备JS代码之外,还可以在Preparation code HTML区域准备你的HTML代码、CSS样式表,以及引入第三方JS库(如jQuery等)。

准备好数组之后,就在下面的“Code snippets to compare”中分别填入算法的简单描述(Title)和代码(Code),Async选项框是用来测试一些异步调用的性能的,我们的代码没有使用异步方法,所以不必勾选。

直接用加号连接:

1 var result = '';
2 for (var i = 0, length = bigArray.length; i < length; i++) {
3     result += bigArray[i];
4 }

用数组的join函数:

1 var result = bigArray.join('');

jsPerf默认只有两个测试用例,如果你要添加额外的,可以点击最下面的“Add code snippet”添加,另一个按钮“Beautify code”可以帮助你格式化代码,自动调整缩进,让代码显示更美观。

最后,点击“Save test case”保存测试用例。浏览器会自动跳转到测试页面。点击这里(http://jsperf.com/compare-string-concat)可以直接查看完整的测试用例。

有时在提交了测试用例之后发现有问题,可以通过在测试地址后面加/edit打开测试用例的编辑页面,添加和修改你的测试用例。

运行测试

好,点击“Run tests”按钮开始测试两种算法的性能。建议在运行性能测试之前,关闭无关的浏览器页面,关闭其他程序,退出不必要的后台进程,以保证结果不受其他环境的影响。你也可以通过点击个别测试用例的名字单独运行这个例子。

读懂测试结果

测试结果以每秒钟执行测试代码的次数(Ops/sec)显示,这个数值越大越好。除了这个结果外,同时会显示测试过程中的统计误差,以及相对最好的慢了多少(%),统计误差也是非常重要的指标,如果你写的测试用例不好,或者说后台正在运行一些其他程序,会造成统计误差过大,这时测试结果就不够可靠。

在我们这个例子中,在我的Chrome 24浏览器上,第二种方法比第一种方法慢了62%,在Firefox 18上,第二种方法慢了70%,我们惊奇地发现第二种方法反而比第一种更慢!只有在IE8上,第一种方法慢了78%。

jsPerf还会统计所有运行过这个测试用例的浏览器的比较结果,显示在下方的Browserscope区域,可以通过它直观地看出各个版本浏览器的性能横向和纵向比较情况。

异步测试

jsPerf也能支持像setTimeout这种异步的调用测试,异步测试用例需要在书写用例时选中“Async”,并且在异步调用结束后及时调用deffered.resolve()。这儿(http://jsperf.com/smallest-timeout)有一个异步测试用例的示例。

查看别人的测试用例

jsPerf上提供所有测试的查询,打开http://jsperf.com/browse就可以看到最近提交的测试,也可以输入关键词来进行查找。查看别人写的测试用例,可以帮助你发现更多性能调优的方法,以便用于自己的开发工作中。

https://software.intel.com/zh-cn/articles/optimize-web-app-using-jsperf

利用jsPerf优化Web应用的性能的更多相关文章

  1. 优化Web中的性能

    优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...

  2. Web中的性能优化

    优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争.优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的顺 ...

  3. H5 缓存机制浅析 移动端 Web 加载性能优化

    腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...

  4. 十条服务器端优化Web性能的技巧

    服务器  远程桌面连接工具 提高web应用的性能从来没有比现在更重要过.网络经济的比重一直在增长;全球经济超过5%的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其 ...

  5. 十条服务器端优化Web性能的技巧总结

    原文地址:http://www.jb51.net/yunying/452723.html 提高 web 应用的性能从来没有比现在更重要过.网络经济的比重一直在增长:全球经济超过 5% 的价值是在因特网 ...

  6. QQ音乐Android客户端Web页面通用性能优化实践

    QQ音乐 Android 客户端的 Web 页面日均 PV 达到千万量级,然而页面的打开耗时与 Native 页面相距甚远,需要系统性优化.本文将介绍 QQ 音乐 Android 客户端在进行 Web ...

  7. web移动端性能调优及16ms优化

    本文只是一个索引,收集了网络上大部分关于调试及优化方面的文章,从中挑选了一些比较好的文章分享给大家. 移动端性能不及桌面浏览器性能的10分之1,特别是在android设备良莠不齐的情况下,性能显得尤为 ...

  8. 利用Gulp优化部署Web项目[长文慎入]

    Gulp Gulp是一款项目自动化的构建工具,与Grunt一样可以通过创建任务(Task)来帮助我们自动完成一些工作流的内容.当然,今天我们的内容并不是讨论这二者的区别,仅仅是介绍介绍如何利用Gulp ...

  9. 【转】利用TCMalloc优化Nginx的性能

    From: http://www.linuxidc.com/Linux/2013-04/83197.html TCMalloc的全称是 Thread-Caching Malloc,是谷歌开发的开源工具 ...

随机推荐

  1. for循环中 i++和++i 是否有区别?

    正常情况下  i++和++i是有区别的: 前者是:先引用,后增加, 后者是:先增加,后引用, 但是在for循环中: for(var i=0;i<10;i++){ System.out.print ...

  2. Jquery easyUI datagrid载入复杂JSON数据方法

    1.JSON数据为: {     "total":28, "rows": [     {       "itemNo": "1&q ...

  3. CentOS6.x和CentOS7.X启动系统不显示进度条设置方法

    [root@ok Desktop]# vi /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do no ...

  4. Google 商店:您的应用静态链接到的 OpenSSL 版本有多个安全漏洞。建议您尽快更新 OpenSSL

    安全提醒 您的应用静态链接到的 OpenSSL 版本有多个安全漏洞.建议您尽快更新 OpenSSL. 在开头为 1.0.1h.1.0.0m和 0.9.8za的 OpenSSL 版本中这些漏洞已得到修复 ...

  5. Java多线程简析——Synchronized(同步锁)、Lock以及线程池

    Java多线程 Java中,可运行的程序都是有一个或多个进程组成.进程则是由多个线程组成的.最简单的一个进程,会包括mian线程以及GC线程. 线程的状态 线程状态由以下一张网上图片来说明: 在图中, ...

  6. ng-class中的if else判断

    ng-class中的if else判断 来自于stackoverflow的一个问题,自己刚好用到,搬过来做个标记.原问题链接 在使用ng-class时,有些时候会碰到根据是否满足条件来设置元素的样式, ...

  7. javac编译出来的程序运行报错“错误: 找不到或无法加载主类”

    使用javac编译java文件生成class文件 >javac HelloWorld.java执行class文件>java HelloWorld 原因: 含有包名 解决办法: 按照包的结构 ...

  8. jquery文件导入问题

    开发前台web,导入jquery文件的时候最好用 <script type="text/javascript" src="path"></sc ...

  9. Hadoop中MapReduce计算框架以及HDFS可以干点啥

    我准备学习用hadoop来实现下面的过程: 词频统计 存储海量的视频数据 倒排索引 数据去重 数据排序 聚类分析 ============= 先写这么多

  10. dedecms中如何去掉文章页面的广告

    在arcticle_arcticle.htm页面找到广告调用代码{dede:myad name='myad'/}全部去掉就好了,如果要换成自己的广告,就换广告位标识 myad 就可以了