Javascript优化五大原则

来源:mikecat.net 时间:2007-10-30 13:49:00 

首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略。例如FF、Opera和Safari的JS引擎,都对字符串的拼接运算(+)做了特别优化。显然,要获得最大效率,就必须要了解引擎的脾气,尽量迎合引擎的口味。所以对于不同的引擎,所作的优化极有可能是背道而驰的。

而如果做跨浏览器的web编程,则最大的问题是在于IE6(JScript 5.6)!因为在不打hotfix的情况下,JScript引擎的垃圾回收的bug,会导致其在真实应用中的performance跟其他浏览器根本不在一个数量级上。因此在这种场合做优化,实际上就是为JScript做优化!

所以第一原则就是只需要为IE6(未打补丁的JScript 5.6或更早版本)做优化!

如果你的程序已经优化到在IE6下可以接受的性能,那基本上在其他浏览器上性能就完全没有问题。

因此,注意我下面讲的许多问题在其他引擎上可能完全不同,例如在循环中进行字符串拼接,通常认为需要用Array.join的方式,但是由于 SpiderMonkey等引擎对字符串的“+”运算做了优化,结果使用Array.join的效率反而不如直接用“+”!但是如果考虑IE6,则其他浏览器上的这种效率的差别根本不值一提。

JS优化与其他语言的优化也仍然有相同之处。比如说,不要一上来就急吼吼的做优化,那样毫无意义。优化的关键,仍然是要把精力放在最关键的地方,也就是瓶颈上。一般来说,瓶颈总是出现在大规模循环的地方。这倒不是说循环本身有性能问题,而是循环会迅速放大可能存在的性能问题。

所以第二原则就是以大规模循环体为最主要优化对象。

以下的优化原则,只在大规模循环中才有意义,在循环体之外做此类优化基本上是没有意义的。

目前绝大多数JS引擎都是解释执行的,而解释执行的情况下,在所有操作中,函数调用的效率是较低的。此外,过深的prototype继承链或者多级引用也会降低效率。JScript中,10级引用的开销大体是一次空函数调用开销的1/2。这两者的开销都远远大于简单操作(如四则运算)。

所以第三原则就是尽量避免过多的引用层级和不必要的多次方法调用。

特别要注意的是,有些情况下看似是属性访问,实际上是方法调用。例如所有DOM的属性,实际上都是方法。在遍历一个NodeList的时候,循环条件对于nodes.length的访问,看似属性读取,实际上是等价于函数调用的。而且IE DOM的实现上,childNodes.length每次是要通过内部遍历重新计数的。(My god,但是这是真的!因为我测过,childNodes.length的访问时间与childNodes.length的值成正比!)这非常耗费。所以预先把nodes.length保存到js变量,当然可以提高遍历的性能。

同样是函数调用,用户自定义函数的效率又远远低于语言内建函数,因为后者是对引擎本地方法的包装,而引擎通常是c,c++,java写的。进一步,同样的功能,语言内建构造的开销通常又比内建函数调用要效率高,因为前者在JS代码的parse阶段就可以确定和优化。

所以第四原则就是尽量使用语言本身的构造和内建函数

标签:优化,Javascript,JScript
0
投稿

猜你喜欢

  • 在MySQL数据库中如何来复位根用户的密码

    2008-12-03 16:57:00
  • js游戏 俄罗斯方块 源代码

    2008-01-24 13:14:00
  • SQLServer 游标简介与使用说明

    2009-07-02 13:53:00
  • 弹出对话框,点击跳出一个可拖动的层(对话框)

    2009-09-07 12:56:00
  • CSS hacks与争议

    2007-11-19 12:56:00
  • 如何用Axure制作Tab页签

    2009-02-08 17:53:00
  • 用CSS3将你的设计带入下个高度[译]

    2009-06-22 13:03:00
  • [整理版]防止Access数据库被下载的9种方法

    2007-08-10 09:31:00
  • js查找/搜索页面中的字符源代码

    2008-02-17 17:13:00
  • JavaScript 颜色梯度和渐变效果

    2009-03-18 11:16:00
  • 图片格式与设计那点事儿

    2011-01-06 12:17:00
  • 二级下拉菜单代码

    2008-11-01 18:18:00
  • 用VB生成DLL封装ASP代码一个例子:连接access数据库等

    2008-04-07 13:06:00
  • 用javascript来实现仿gogle动画导航

    2007-11-30 14:15:00
  • js和asp操作fso比较

    2007-09-23 09:17:00
  • 修正IE6不支持position:fixed的bug[译]

    2009-08-01 12:44:00
  • 网页设计应急小技巧

    2011-10-05 18:52:57
  • [译]“我心中的ebay”

    2008-06-04 12:09:00
  • PHP设计模式之模板方法模式Template Method Pattern详解

    2023-05-25 00:24:26
  • select @@identity的应用(得到刚插入数据的ID)

    2009-09-10 11:24:00
  • asp之家 网络编程 m.aspxhome.com