怎样为IE浏览器的javascript提速

所属分类: 软件教程 / 浏览下载 阅读数: 414
收藏 0 赞 0 分享

 随着现在网页设计越来越多的应用javascript技术,而且浏览器的Javascript引擎运行速度也成为各大浏览器比拼性能的重要指标,各家浏览器厂商皆宣称他们的浏览器速度更快,希望搅动现存的竞争态势。IE8浏览器的Javascript运行速度虽然相对于IE7以及IE6有着很大的提升,但相对于Webkit引擎的浏览器还是有一定的差距,在去年的ZDNET Javascript测试上Chrome浏览器表现突出,一举击败Firefox、Safari和微软的IE浏览器。不过因为IE浏览器相对庞大的使用人群,我们有必要为IE浏览器的javascript来提提速。

 

我们知道,浏览器在执行期时是由内到外执行脚本的,那么离我们的脚本最远的全局对象,很可能要跨越几层作用域才能访问到它。不过在IE浏览器中,从最内层到最外层要花的时间比其他多出很多。加之,javascript是一种胶水语言,它必须要调用DOM对能完成我们大多数选择。最著名的就是选择元素(document.getElementById,document.getElementsByTagName,docuemnt.evaluate,document.querySelector),创建元素(document.createElement),此外还有document.body,document.defaultView.getComputedStyle等等,频繁地调用document对象,但是document是位于window对象下,因此这路程就更远了。就了提速,我们必须把它们保存在一个本地变量,那么每次就省得它长途跋涉了。这种技术的运用明显体现在jQuery的源码中:

(function( window, undefined ) {

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
		// The jQuery object is actually just the init constructor 'enhanced'
		return new jQuery.fn.init( selector, context );
	},

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,

	// Map over the $ in case of overwrite
	_$ = window.$,

	// Use the correct document accordingly with window argument (sandbox)
	document = window.document,

        //====================省=================
       }
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;

})(window);

把window传进闭包内,就省得它每次都往外找window了。

再看其他类库

//Raphael
window.Raphael = (function () {
    var separator = /[, ]+/,
        elements = /^(circle|rect|path|ellipse|text|image)$/,
        doc = document,
        win = window,
//************略**************
//dojo
d.global = this;
//Ext
DOC = document,
//YUI
//************略************
            } else if (i == 'win') {
                c[i] = o[i].contentWindow || o[i];
                c.doc = c[i].document;
//************略************
Y.config = {

            win: window || {},
            doc: document,

但是如果你没有引入类库,如果让IE的javascript跑得更快些呢?用一个变量把它储存起来?在一个国外的博客看到一种很厉害的劫持技术,偷龙转凤把全局变量document变成一个局部变量。

/*@cc_on _d=document;eval('var document=_d')@*/

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
</body>
</html>

运用提速技术后:

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">
/*@cc_on _d=document;eval('var document=_d')@*/

var date = new Date;
for (var i = 0; i < 100000; i++) document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!!!
</body>
</html>

经测试,用了提速技术后,IE的性能比较

IE6
  document document.getElementById document.title
没有使用提速技术 485 1110 1219
使用提速技术后 109 609 656
IE8
  document document.getElementById document.title
没有使用提速技术 468 797 843
使用提速技术后 78 328 407

我们看一下实现原理:

document;
doc;      //很明显,调用这个比直接document快,document还要钻进window内部找一番

如何劫持它呢?

var doc = document;
var document = doc;

这样明显不行因为在预编译阶段,var变量会提前,上面代码相当于

var doc
var document  //这里被劫持了
doc = document //注意,document已经变成undefined
document = doc //相当于window.undefined = undefined

没有办法,只好在执行期才定义这个document变量,javascript的动态解析技术派上用场了,eval就是其代表之一。

var doc = document;
eval('var document = doc');

为了让IE专用,用了IE特有的条件编译。

/*@cc_on
var doc = document;
eval('var document = doc');
@*/

嘛,window的东西其实蛮多,我们一一把它们变成本地变量又如何?

/*@cc_on
eval((function(props) {
  var code = [];
  for (var i = 0 l = props.length;i<l;i++){
    var prop = props[i];
    window['_'+prop]=window[prop];
    code.push(prop+'=_'+prop)
  }
  return 'var '+code.join(',');
})('document event body location title self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' ')));
@*/

我们可以再扩展一下,让其更多全局变量或全局方法局部化。不过经验测,FF使用它会报错,chrome则慢了,其他浏览器不明显。

        if( !+"v1"  ){
          var code = [],ri = 0,prop,str = "var "
          for(var a in window)
            code[ri++] = a;
          for (var i = 0 ,n = code.length;i<n;i++){
            var prop = code[i]
            window['_'+prop] = window[prop];
            str += prop+'=_'+prop+","
          }
          str = str.slice(0,-1);
          eval(str)
        }

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>javascript提速技术 by 司徒正美</title>

<script type="text/javascript">
var __chrome = navigator.userAgent.indexOf("Chrome") !== -1;
var __firefox = !!window.Components

if( !__chrome & !__firefox ){

var code = [],ri = 0,prop,str = "var "
for(var a in window)
code[ri++] = a;
for (var i = 0 ,n = code.length;i<n;i++){
var prop = code[i]
window['_'+prop] = window[prop];
str += prop+'=_'+prop+","
}
str = str.slice(0,-1);
eval(str)
}
var date = new Date;
for (var i = 0; i < 100000; i++)
document;

alert(new Date - date);

</script>

</head>
<body>
!!!!!!
</body>
</html>

文章来源:http://www.cnblogs.com/rubylouvre/archive/2010/02/11/1667628.html

虽然IE8的发布并没有给我们带来多大的惊喜,但根据微软所公布了IE9的各种评测效能信息,惊奇的发现,IE9在而针对Javascript引擎性能的SunSpider测试中,IE9大幅超越了IE7与IE8,并与Chrome、Safari及Firefox浏览器的Javascript运行基本处于同一等级。希望微软以后不要在重蹈IE8的覆辙,毕竟微软现在出新浏览器的动作是越来越勤奋了,记得当前IE6了,不知用了多少年,才听说有了IE7了,到现在IE8才超越IE6成为全球最流行的浏览器版本,我们期盼微软IE9浏览器能够让竞争对手刮目相看。

更多精彩内容其他人还在看

没有BT种子还能否继续下载?

  网上一直上演着一茬又一茬跪求BT种子的凄惨故事。很多朋友对此不屑一顾,他们说,没有种子也可以下载呀。BT下载缺少种子到底还能下载么?喜欢BT下载的朋友一起来看看这其中究竟是怎么回事。   正方观点:没有种子,BT下载任务无法完成,直到新种子出现才能继续下载
收藏 0 赞 0 分享

迅雷抓鸡实现方法与防范技巧

  人世间最大的悲哀,莫过于人家正在害你,不知情的你还对他感恩戴德。这样荒唐的事情,只会在电视剧中出现吗?你想过自己也会变成那样吗?如果你不信,看完本文准让你大吃一惊!   迅雷抓鸡法最阴毒的就是它共享的捆绑文件令受害者无法产生警惕,反而会因为下载速度提
收藏 0 赞 0 分享

Google短信搜索掌握丰富手机资讯

  Google最新推出“短信搜索”功能。用户利用手机向Google发送了一条带有搜索关键字的信息后,Google会判断要查找的特定信息,并自动将所查询的结果以文字形式返回到手机中。不过它与传统的搜索引擎不同,在结果中仅有文字而无具体的链接、网页,这样可方
收藏 0 赞 0 分享

巧用迅雷下载来保存注册码

巧用迅雷的在线保存功能,就可以将自己喜爱的软件的注册码保存在网上,随时使用!这样我们的软件就可以做到永不过期!   实现步骤如下:   第一步:登录雷友   打开迅雷5,单击左侧下方“雷友信息”中的输入框,输入雷友帐号和密码,在打开窗口
收藏 0 赞 0 分享

上网冲浪 七款主流网页浏览器评测

  对于一个网民来说,网页浏览器是不可或缺的软件。面对各式各样的浏览器,我们该如何选择,什么样的浏览器最适合你?我们从用户需求角度出发,对当前流行的7款浏览器进行横向评测,让大家找到适合自己的“冲浪”工具。   测评软件和平台   本次进行测
收藏 0 赞 0 分享

下载、播放不间断 将偷偷看进行到底

  N久没上网下电影看了,被一个GG告知现在流行边看边下,不用再为了下一本片子而等一个通宵,也不会因为没有时间下载片子而没得看。   这样熊掌兼得的好事摆在眼前怎么可能错过呢?于是在百度里一搜,果真看到了不止一家打着边下边看的旗号的BT下载工具。脱兔、ToTolook
收藏 0 赞 0 分享

无需扬鞭自奋蹄 迅雷电骡批量下载方法

  电骡emule作为最为流行的下载方式之一,成为大家的最爱。但是emule有一个最大的问题,就是下载速度太慢,同时这个问题也使得其下载稳定性不够。迅雷的出现很好地解决了这个问题,但是迅雷有一个问题,无法在新建任务时直接输入多个电骡下载资源链接。不过,我们还是有一
收藏 0 赞 0 分享

FlashGet下载文件管理轻松高效的技巧

  在网络上下载资源时,我们最关心的问题就是下载速度,其次是下载后的管理。我们知道,最新版的网际网际快车2.0通过特有的P4S技术为我们提供了高速的下载,不仅如此,它还提供了强大的文件管理功能,方便日后对文件进行打理,提高操作效率。那么,我们要如何最合理地应用
收藏 0 赞 0 分享

IE有效避免恶意网页中恶意代码的攻击

  恶意网页成了宽带的最大威胁之一。以前使涌Modem,因为打开网页的速度慢,在完全打开前关闭恶意网页还有避免中招的可能性。现在宽带的速度这么快,所以很容易就被恶意网页攻击。   一般恶意网页都是因为加入了用编写的恶意代码才有破坏力的。这些恶意代码就相当于一些
收藏 0 赞 0 分享

用命令清除IE7上网浏览历史记录

  无论是出于保证计算机性能还是数据安全方面的考虑,我们常常需要及时清除浏览器的历史记录,包括浏览器缓存、所记录的Cookies、历史记录、密码等。一般而言,在IE7(Internet Explorer 7)中,相应的是操作是通过“Internet 选项”
收藏 0 赞 0 分享
查看更多