其实微博是个好东西,关注一些技术博主之后,你不用再逛好多论坛了,因为一些很好的文章微博会告诉你,最近看到酷勤网推荐的一篇文章《30个提高Web程序执行效率的好经验》,文章写得不错,提到一些经验都比较实用,是我们每一个做前端开发的人员都必须知道的。本人逐条解读一下,个人意见可能比较浅薄,看看大家对各个经验点怎么看了。

1、尽量避免使用DOM。当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用。创建页面元素的时候尽量不要使用DOM的document.createElement/appendChild()方法来创建,换用设置innerHTML的方法来替换。

jiuye:

过多使用DOM会增加DOM树的规模,进而影响文档遍历以及查找元素的性能。如果使用DOM元素的使用,建议使用如下方法进行:

  1. var obj = document.getElementById("myId");
  2. obj.XXX...;

2、eval()有问题,new Fuction()构造函数也是,尽量避免使用它们。

jiuye:

使用eval()或new Function()构造函数作用于字符串表示的源码时,js引擎都需要将源码转换成可执行代码。这样的操作是很消耗资源的要比简单的函数调用慢100倍以上。

同时,eval()函数效率特别低,由于事先无法知晓传给 eval 的字符串中的内容,eval在其上下文中解释要处理的代码,也就是说编译器无法优化上下文,因此只能有浏览器在运行时解释代码。这对性能影响很大。newFunction()构造函数比eval()略好,因为使用此代码不会影响周围代码,但是他的速度也快不到哪里去。

可以通过重写eval()来替换直接使用eval(),通过创建匿名函数的方法来替换new Function()。

3、拒绝使用with语句。 它会导致当你引用这个变量时去额外的搜索这样的一个命名空间,with里的代码在编译时期是完全未知的。

jiuye:

with的效率很低,with结构又创建了一个作用域,以便使用变量时脚本引擎搜索。这本身只轻微的影响性能。但严重的是编译时不知道此作用域内容,因此编译器无法像对其他作用域(如函数产生的作用域)那样对之优化。

可以使用变量引用对象,然后使用变量访问对象属性。但是此种方法要求属性非文字类型。

先来看一个with的使用:

  1. with( test.info ) {
  2. name = 'John';
  3. sex = 'male';
  4. }

再看看使用变量引用对象的实例:

  1. var obj = test.infor;
  2. obj.name = 'John';
  3. obj.sex = 'male';

4、使用for()循环替代for…in循环。因为for…in循环在开始循环之前需要Script引擎创建一个含有所有可循环属性的List,需要多检查一次。

jiuye:

for...in循环需要脚本引擎创建所有可枚举的属性列表,然后检查是否存在重复。

5、把try-catch语句放在循环外面,不要放在循环里面,因为异常是很少发生的,放在外面避免每次都要执行它们。

jiuye:

其实不仅仅是循环,因为try-catch-finally结构比较特殊。和其他语法结构不同,它在当前作用域中创建新变量。每当catch执行时,就会将捕获到的exception对象赋给一个变量。这个变量不属于任何脚本。它在catch语句开始时被创建,在结束时被销毁。由于此函数比较特殊,且是在运行时动态创建动态销毁,有些浏览器对其的处理并不高效。把catch语句放在关键循环中将极大影响性能。如果可能,应在js中不频繁被调用的地方进行异常处理,或通过检查某种动作是否被支持来避免使用。

6、不要过多使用全局变量,全局变量的生命周期贯穿整个js的生命周期,而本地变量的存在范围随着本地命名空间的销毁而消失。当在函数或其它地方引用一个全局变量时,脚本引擎需要搜索整个全局命名空间。

7、fullName += 'John'; fullName += 'Holdings';执行速度快于fullName += 'John' + 'Holdings'。

jiuye:

这个不知道该怎么去解释一下,至少我本人在js编码时不会写出这样的语句:fullName += 'John' + 'Holdings'。

8、如果你需要把多个字符串连接起来,最好是把他们做成一个数组,然后调用join()方法实现这个操作。这种方式在生成HTML片段时尤其有效。

jiuye:

这个主意赞的,以前没注意到!!!

9、对于简单的任务,最好使用基本操作方式来实现,而不是使用函数调用实现。例如val1 < val2 ? val1 : val2;执行速度快于Math.min(val1, val2);,类似的,myArr.push(newEle);慢于myArr[myArr.length] = newEle。

jiuye:

总之一句话,能用js简单实现的东东就别用函数了,调用函数处理时性能肯定要比直接处理来的慢一点的。

10、将函数的引用作为参数传递到setTimeout()和setInterval()里优于将函数名作为字符串参数传递(硬编码)。例如,setTimeout(“someFunc()”, 1000)执行效率慢于setTimeout(someFunc, 1000)。

jiuye:

setTimeout()setInterval()方法类似于eval()。如果传进参数是字符串,则在一段时间之后,会和eval()一样执行字符串值,当然其低效率也和eval()一样低。但这些方法也可以接受函数作为第一个参数。在一段时间后将调用此函数,但此函数可在编译时被解释和优化,也就是说会有更好的性能。

使用字符串作为参数:

  1. setInterval('myFunction()',1000);
  2. setTimeout('alert(111);',500);

再来看看下面这个做法是不是更舒服点呢?

  1. setInterval(myFunction,1000);
  2. setTimeout(function() {
  3. alert(111);
  4. },500);

11、当进行遍历操作时避免使用DOM操作。通过像getElementsByTagName()这 种方法得到的DOM元素队列都是动态的;有可能在你还没有对它遍历完成时,它已经被改变。这有可能导致死循环。

12、当你对对象的成员(属性或方法)进行反复操作时,先存储对它们的引用。例如var getTags = document.getElementsByTagName; getTags(‘div’)。

jiuye:

这里其实说的和1是一类问题,不要频繁操作DOM。

13、在任何的代码段里,在局部变量范围外存放一个这个局部变量的引用。例如:

  1. function foo(arr) {
  2. var a = something’;
  3. //变量a对于下面的代码就是范围外变量,这个变量的引用在很多情况下会有用处。
  4. for (var i = 0, j = a, loopLen = arr.length; i < loopLen; i++) {
  5. //do something
  6. }
  7. }

14、for(var i=0; i < someArray.length; i++) {…}的执行效率慢于for (var i=0, loopLen=someArray.length; i<loopLen; i++) {…}。

15、在HTTP头信息里加入缓存控制过期和最大存活时间标记。

16、优化CSS。要使用<link>方式,而不要使用@import方式。

jiuye:

关于前端页面CSS的优化我前面的文章有介绍过,这里不再赘述。同样针对js来说也是需要去做优化的。

17、使用CSS技术来优化图片资源。

jiuye:

这一点对移动网站的开发来说尤为重要,图片的处理是移动网站性能提升的一个很大的制约点。目前有所为的CSS“雪碧”技术、响应式图片显示等多种技术可以来做这个事情。

18、用GZip方式压缩 .js 和 .css 文件。如果你使用的是Apache,在 .htaccess 里设置压缩方式,你的HTML, XML 和 JSON 也同时会被压缩。

19、使用JavaScript压缩工具。除了使用YUI和JSMin外,你还可以试一试Google Closure。

20、优化每个页面上的各种资源,把它们拆分到各个子域上,这么它们就能够并行下载。

jiuye:

可以把页面中引用的js文件、CSS文件、静态图片资源都统统扔到CDN上面去。

21、将CSS样式表放在页面的最顶端,这样能方便包括IE在内的浏览器进行解析。

jiuye:

同时提醒一下,js的引用放到页面底部</body>的前面。

22、尽量将DOM结构保持的越简单越好。DOM的体积会影响相关的操作效率,像查找,遍历,DOM改动都有影响。document.getElementsByTagName(‘*’).length这 个值越小越好。

jiuye:

在开发页面的时候保持页面的“干净”、“清洁”,不要过多使用元素,能简化一定要简化。

23、注意你使用的选择器。例如,如果你想获取一个ul下的直接子元素,使用jQuery(“ul > li”)而不要使用jQuery(“ul li”)。

24、当切换元素的可见性时(display),请记住:element.css({display:none})的 速度快于element.hide() 和 element.addClass(‘myHiddenClass’)。除非在一个循环里,我选择element.addClass(‘myHiddenClass’), 这样会使代码更简洁。

25、当你使用完对DOM的引用变量后,要把它置为NULL。

26、使用AJAX时,GET的执行效率高于POST。所以要尽量使用 GET 方式。只是要注意一点,IE只允许你用GET传送2K的数据。

jiuye:

本人目前开发过程中暂时不要考虑IE,所以我这个伪前端比你们正牌前端要开放些自由些,哈哈~写了好多了,玩笑一下,娱乐一把!

27、小心使用脚本动画。没有硬件的支持,动画会执行的很慢。尽量避免使用那些没有实际价值的动画效果。

jiuye:

当然,现在有CSS3之后,一些CSS3的转换,变换等动画效果同时也要考虑执行的性能问题,因为山寨机,低端移动设备对CSS3的动画支持性能还不是很牛逼的!

28、如果你的background-image对于这个图片的容器太小的话,请避免使 用background-repeat。如果你的背景图片需要来回填充很多次才能充满背景,那么将background-repeat属性设置成 background-image 和repeat-x 或 repeat-y来 达到填充背景的效果的做法是不明智的,这种填充方式的效率特别的低。你应该尝试使用一个足够大的图片来做background-image并 且使用background-repeat: no-repeat。

jiuye:

这个就要辛苦下UED的MMs。

29、布局时不要使用<table>。<table>在浏览器完全把它画出来之前需要反复绘制好几次。因为DOM 中<table>是很少见的一种之后输出的会影响之前输出的显示效果的元素。对于表格数据来说,你可以使用table-layout:fixed; 这是一种更有效的现实算法,根据CSS 2.1技术说明,这种写法可以让表格一行一行的输出。

jiuye:

虽然有有效的现实算法来弥补<table>布局的缺点,但是本人是实在不愿意使用<table>布局,尤其在移动页面开发中,有<div>布局为什么不用?现在还有CSS3的盒式布局,都比较牛逼的!

30、尽可能的使用原始JavaScript。限制JavaScript框架的使用。

jiuye:

不要滥用js框架,不过针对我目前的移动网站开发来说,虽然很苦逼的用jQuery,但是想jQuery Mobile、zepto等都是很优秀的移动开发js框架。当然如果视觉上有各自的风格和严格要求,jQuery Mobile就不建议,个人感觉jQuery Mobile的最大好处就是提供了一套标准的UI组件。

解读30个提高Web程序执行效率的好经验的更多相关文章

  1. (转)对《30个提高Web程序执行效率的好经验》的理解

    阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...

  2. 30个提高Web程序执行效率的好经验

    尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...

  3. 2.对《30个提高Web程序执行效率的好经验》的理解

    摘自:http://www.cnblogs.com/powertoolsteam/archive/2010/07/12/1775933.html 文章中执行代码的消耗时间是怎么计算的,有知道的同学可以 ...

  4. 30条技巧提高Web程序执行效率

    尽量避免使用DOM.当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用.使用设置innerHTML的方法来替换document.createElement/append ...

  5. 关于提高python程序执行效率的思路和想法

    相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. pyt ...

  6. 如何提高SQL的执行效率

    一.因情制宜,建立“适当”的索引 建立“适当”的索引是实现查询优化的首要前提. 索引(index)是除表之外另一重要的.用户定义的存储在物理介质上的数据结构.当根据索引码的值搜索数据时,索引提供了对数 ...

  7. 如何在数据访问层上提高js的执行效率

    本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以 ...

  8. 为什么 asnyc await 可以提高web程序的吞吐量

    (转网上一段话) Web程序天生就是多线程的,且web线程都是跑的线程池线程(使用线程池线程是为了避免不断创建.销毁线程所造成的资源成本浪费),而线程池线程可使用线程数量是一定的,尽管可以设置,但它还 ...

  9. <每日一题>题目19:简单的程序执行效率面试题

    # 将下面的函数按照执行效率高低排序.它们都接受由0至1之间的数字构成的列表作为输入.这个列表可以很长.一个输入列表的示例如下:[random.random() for i in range(1000 ...

随机推荐

  1. Algorithm

    经过慎重考虑,也经过反复思考.查阅网上相关资料 一位高手对我的建议: 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程 ...

  2. 编码、解码Html代码

    引用 Base64-80.js 文件 做网页的时候有时候需要把富文本框的html代码保存到数据库,那么就需要编码后保存到数据库.浏览器端或后台再解码作绑定 *编码:encode64(str) *解码: ...

  3. problems record

    1,java类中字体MS Gothic 2,得到请求资源,例如,http://localhost:8080 public static URL serverURL(HttpServletRequest ...

  4. python模块与包

    模块是包括python定义和声明的文件.文件名=模块名+".py".模块名保存在全局变量__name__中. 1.模块中的执行语句,只是在导入时执行一次.这些语句通常用于初始化模块 ...

  5. redis研究之watch

    具体的看注释,代码如下: public static void TransTest() { RedisClient client1 = new RedisClient(host, port); Red ...

  6. 关于C++几个容易混淆的概念总结

    1.函数指针和指针函数 函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象.函数指针的定义: int (*func)(int a, int b); // 声明函数指针 指 ...

  7. Make Ubuntu 14.04 Fullscreen and virtualbox

    sudo apt-get remove libcheese-gtk23 sudo apt-get install xserver-xorg-core sudo apt-get install virt ...

  8. HTML 表单和表格

    1.使用表单标签 网站使用 HTML 表单可与用户进行交互,表单元素是允许用户在表单中输入内容,比如:文本框.文本域.单选框.复选框.下拉列表.按钮等等,表单可以把浏览者输入的数据传送到服务器端,这样 ...

  9. MySql中常用语句

    1.查询语句: SELECT  查询字段  FROM  表名   WHERE 条件 查询字段可以使用 通配符* 字段名 别名(把长的名字命名一个别名,比较短的) 通配符:SELECT * FROM ' ...

  10. 简简单单制作鼠标静态动态 ani cur 小结 鼠标形状指针

    近日在网上看到一个视频录制软件里的鼠标样子的指针感觉蛮好的自己制作了一个,效果还不错,几乎跟那个鼠标形状一模一样啦.总结了下制作过程现分享如下:1.首先用ps建立一个30*30像素的空白图片 然后将自 ...