Board logo

标题: [版本发布] [原创]提高页面中JS脚本执行效率的插件 [打印本页]

作者: 杂草    时间: 2008-1-26 01:05     标题: [原创]提高页面中JS脚本执行效率的插件

这个插件是自动运行的,不需要显示.
但是插件本身不能定义不显示,所以只能手动在"自定义状态栏"里删除这个插件的图标

测试:
[attach]39093[/attach]

使用本插件前:
[attach]39094[/attach]

使用本插件后:
[attach]39095[/attach]




插嘴 by 小絮
这个插件可以用过滤规则来实现:
  1. #ex#<\/head>([\r\n]+)###<script language="Javascript">/*@cc_on eval(function(props){var code=[];for(var i=0;i<props.length;i++){var prop=props;window['_'+prop]=window[prop];code.push(prop+'=_'+prop)}return 'var '+code.join(',');}('document top setInterval clearInterval setTimeout clearTimeout alert confirm prompt open close showModalDialog showModelessDialog'.split(' '))); @*/</script>$1</head>$1
复制代码

这样就可以不显示图标和解决刷新后无效的问题了。

再插一嘴 by 杂草
不好意思,改了一下,因为放在</head>之前才能起到最大作用。
注1:用过滤规则的方法,对本地网页无效,比如D:\test.htm。
注2:是不是应该捧一下我那篇“另类插件”...

改进 by 杂草
1.原来的过滤规则会导致某些网页不能正常显示,比如QQ空间,163.com无法写邮件等......
  在这之前用白名单方式暂时解决这条规则的冲突的,可以去掉相关的白名单了。
2.另加一条加速背景图的规则。
  IE对于<img>的图,会自动判断本地缓存,但是对于css中的background-image的背景图就每次都是重新下载。
  1. #ex#<\/head>([\r\n]+)###<script language="Javascript">try {document.execCommand("BackgroundImageCache", false, true);} catch(e) {}</script>$1</head>$1
复制代码


[ 本帖最后由 杂草 于 2009-2-20 21:23 编辑 ]
作者: xlez    时间: 2008-1-26 01:52

  1. eval(
  2.     function(props)
  3.     {
  4.         var code = [];
  5.         for (var i = 0; i < props.length; i++)
  6.         {
  7.             var prop = props;
  8.             window['_' + prop] = window[prop];
  9.             code.push(prop + '=_' + prop)
  10.         }
  11.         return 'var ' + code.join(',');
  12.     }
  13.     ('document self top parent setInterval clearInterval setTimeout clearTimeout alert confirm prompt open close showModalDialog showModelessDialog'.split(' '))
  14. );
复制代码
上面是什么意思啊?好像绕了一圈又用 var 重命名?
theworld本来就是ie内核,为什么还要条件编译?
望高手指点。
还有就是eval,直接不就完了?window['_' + prop] = window[prop];

[ 本帖最后由 xlez 于 2008-1-26 02:36 编辑 ]
作者: 81635631    时间: 2008-1-26 02:09

此等高深好东西一定是要顶的
作者: needed    时间: 2008-1-26 02:44

内存换效率?
作者: ttrry    时间: 2008-1-26 11:42

其实只一行也是可以的,且经试验效果相同~
SpeedUpJS.htm中内容:
<script language="Javascript">
/*@cc_on _d=document;eval('var document=_d')@*/
</script>
听别人说可以提高JS运行速度5倍,但我在我的机器上试验可提高10倍左右~!

原理说明:
首先,IE里document就这样直接被调用的话被执行的是window 对象的内部函数,而这个比较低效的。根据这一点,下面的处理可以提高速度:
var doc = document;

document; // 慢
doc; // 这个比上面的(document)快

虽然像上面那么写可以直接使用,但是之前用到document的地方都要去替换,这个有点麻烦了点吧。所以,看下面的:
var doc = document;
var document = doc;
可以实现的话那就太好了……

了解JavaScript的人应该知道,JavaScript的变量是在最开始的时候就生成的,所以这里的document就变成了undefined了。
没关系,继续改进~
var doc = document;
eval(’var document = doc’);

eval的作用就是在作用域范围内改变变量,这样的话,后面的document就可以被正常使用了。
最后,加上只有在IE内有效的条件,就像下面这样就可以了~
/*@cc_on
var doc = document;
eval(’var document = doc’);
@*/

所以,如下面,document以外的全局变量也可以用上面的方法,起到加速的作用。
/*@cc_on
eval((function(props) {
var code = [];
for (var i = 0 l = props.length;i<l;i++){
var prop = props;
window[’_'+prop]=window[prop];
code.push(prop+’=_’+prop)
}
return ‘var ‘+code.join(’,');
})(’document self top parent alert setInterval clearInterval
setTimeout clearTimeout’.split(’ ‘)));
@*/

“alert confirm prompt open close showModalDialog showModelessDialog”这句对JS代码运行优化不起作用,可以去掉~
作者: def    时间: 2008-1-26 11:52

虽然不太懂这个JS效率,但是直觉告诉我这是个好插件,顶了之后马上下下来用!
作者: 杂草    时间: 2008-1-26 12:05

xixi,终于有人google到这篇东西了

1.
对于var doc = document
doc是document对象的引用,而不是克隆,
所以这段代码只是占用很少量的内存.

2.
对于alert("aaa"),其实这是简写的,完整的代码是window.alert("aaa")
document.all.field1.value = "aaa"也是简写,完整的写法是window.document.all.field1.value = "aaa"
可以看到JS大量访问window对象(有一些类除外,比如Math, String, RegExp)
window这个对象太大了,访问起来很费劲,
所以把常用的window对象的属性和方法,在页面中定义一个引用型的变量,以加快调用.

3.
var document = window.document这种写法,用同名的变量覆盖window属性/方法,
不是必须的,也可以var doc = window.document
但是这种同名覆盖的写法,可以使这段代码当作外挂来使用,直接作用在原有的JS脚本上面.

4.
以上文字都是我瞎想的,因为实在无聊啊.哈哈......
作者: 杂草    时间: 2008-1-26 12:28

再给出一个例子,以加深对window对象的印象

<script>
var s;

var date = new Date;
for (var i = 0; i < 100000; i++) s = "ss";
alert(new Date - date);  //79

date = new Date;
for (var i = 0; i < 100000; i++) window.s = "tt";
alert(new Date - date);   //735

alert(s);   //tt(注意:不是ss)
</script>
作者: 81635631    时间: 2008-1-26 15:20

看了这么多.反正就是很有用咯..
作者: wdpfox    时间: 2008-1-27 13:37

是个好插件,多谢楼主分享!
作者: sky5    时间: 2008-1-27 15:33

在IE中据说appendchild比innerHTML要快很多倍,还有对比测试呢
作者: Smin    时间: 2008-1-27 16:48

支持一下。。。。
作者: AY    时间: 2008-1-28 06:11

在页面加载后才提高 js 效率没多大作用吧。
作者: 杂草    时间: 2008-1-28 09:42

"页面加载"与"JS执行"是同一回事吗?
加速的是JS执行效率,不是页面下载速度.
作者: AY    时间: 2008-1-28 11:36     标题: 回复 14# 的帖子

我的意思是在页面加载后才增加 js 效率对日常浏览网页没有太大帮助,因为大部份网页的 js 都是在页面加载时执行的,很少在页面加载后还需要执行大量 js。

我是说 "页面加载" ,并非 "页面下载" 。

[ 本帖最后由 AY 于 2008-1-28 11:39 编辑 ]
作者: 杂草    时间: 2008-1-28 12:29

那就要看TW加载自动插件,是在onload之前还是之后.

不过TW好象一直都有个问题,就是页面刷新后,自动插件并没有再次执行.

anyway,这个插件只是玩具性质,不必太过于迷信"xx加速"这种东东.
作者: ttrry    时间: 2008-1-28 14:26

对,页面刷新后,自动插件不会再次执行~这是个问题,我在另外一个帖就是因了考虑这个才问的
作者: sky5    时间: 2008-1-28 20:42     标题: 杂草,请帮忙看看这段js的效率,为何当位数多或调用太频繁就CPU占用狂飙

function outnum(n,ln){
var s=n.toString().length;
if (s<ln){
var z="";
for (i=0;i<eval(ln-s);i++){z+="0";}return z+n;}
else{return n;}
}
作者: sky5    时间: 2008-1-28 20:42     标题: 有假死现象哦,why

function outnum(n,ln){
var s=n.toString().length;
if (s<ln){
var z="";
for (i=0;i<eval(ln-s);i++){z+="0";}return z+n;}
else{return n;}
}
作者: 杂草    时间: 2008-1-30 12:12

//优化循环
function outnum1(n, ln)
{
    var sn = n.toString();
    for (var i = sn.length; i < ln; i++) sn = "0" + sn;
    return sn;
}
alert(outnum1(123, 5));

//如果是填充"0",可以用10的n次方代替n个"0"相加
function outnum2(n, ln)
{
    var sn = n.toString();
    var i = Math.max(sn.length, ln);
    sn = "" + Math.pow(10, ln) + sn;
    return sn.substring(sn.length - i);
}
alert(outnum2(123, 5));

//如果可以的话,直接用pattern,省去每次调用都要进行加"0"的运算
function outnum3(n, patt)
{
    var sn = n.toString();
    var i = Math.max(sn.length, patt.length);
    sn = patt + sn;
    return sn.substring(sn.length - i);
}
alert(outnum3(123, "00000"));
作者: sky5    时间: 2008-1-30 12:30

这样可是试试不出来的

我自己弄了一段进制转换的js,想用格式化输出,可是非常慢,而且假死

function car(carr){
var cdrr="";
//if (!carr){cdrr='请输入数字';};
for (i=0;i<carr.length;i++){
var m=carr.charAt(i);
//var n=parseInt(m,16).toString(2);
var nts=outnum(m.valueOf(),4);
cdrr+=nts+" ";
}
darr.value=cdrr;
//alert(carr);
}

[ 本帖最后由 sky5 于 2008-1-30 12:33 编辑 ]
作者: 杂草    时间: 2008-1-30 12:41

var s;

var date = new Date;
for (var i = 0; i < 100000; i++) s = outnum1(123, 5);
alert(new Date - date);  //986

date = new Date;
for (var i = 0; i < 100000; i++) s = outnum2(123, 5);
alert(new Date - date);  //1656

date = new Date;
for (var i = 0; i < 100000; i++) s = outnum3(123, "00000");
alert(new Date - date);  //1375

我错了,看来Math.pow和String.substring也是很慢的,这也许是IE的内伤:JS引擎太慢.

而你原来的那个函数,用这种执行10万次来测速的话,根本就死机了.

[ 本帖最后由 杂草 于 2008-1-30 13:04 编辑 ]
作者: xlez    时间: 2008-1-30 17:47


  1. a=5 //长度几位
  2. s='214' //待格式化的数或字符
  3. k=(new Array(a)).join('0').slice(s.length-a)+s
  4. alert(k)
复制代码

欢迎你们到51js.com来讨论js问题。
作者: needed    时间: 2008-1-30 19:00

http://bbs.ioage.com/cn/viewthre ... &authorid=10253
作者: sky5    时间: 2008-1-30 19:24

n版的方法我亲自试过了,在多位的时候超慢的
作者: sky5    时间: 2008-2-2 13:40

杂草兄,这有一个很慢的网页,希望你可以测试一下你的加速器,呵呵

http://club.qingdaonews.com/cachedir/128/31/99/3199534_1.htm
作者: needed    时间: 2008-2-2 14:42

原帖由 sky5 于 2008-1-30 19:24 发表 http://bbs.ioage.com/cn/images/common/back.gif
n版的方法我亲自试过了,在多位的时候超慢的



呵呵.. 来一个猛的

var 长度=5;
var 变量=783;
var 变态的数=10000000;
var 格式化的数;
var date = new Date();
for (var i = 0; i < 100000; i++)
  //格式化的数 = (''+(变态的数+变量)).replace(/^\d{3}/,'');
//(new Array(len).join("0")+num).slice(-len);
格式化的数 = (''+(变态的数+变量)).substr(3);
alert(new Date() - date);
作者: Vidar    时间: 2008-2-2 15:06

使用前 25x-26x,使用後 1x-3x
作者: 冰灼    时间: 2008-2-2 15:30

我知道了,MT的用户群是普通用户,TW的用户群是电脑高手
作者: sky5    时间: 2008-2-2 16:27

我这个16进制转换为2进制中,用OUTNUM格式化的话就假死,后来没办法才用了CASE的

N版请进
作者: needed    时间: 2008-2-2 17:12

这个循环不好
  for (i=0;i<eval(ln-s);i++)

  要么 直接 算出变量

var a = in-s
   for (i=0;i<a;i++)

或者

while(n.length < ln){
    n = '0'+n
}

[ 本帖最后由 needed 于 2008-2-2 17:22 编辑 ]
作者: sky5    时间: 2008-2-2 17:18

1A012300150010006901B20263796777696E4442477C44656275672056657273696F6E20666F722043796777696E0000

例如这样的,很长一串,我要转位2进制慢慢看
作者: needed    时间: 2008-2-2 17:26

嗯嗯. 其实你的 case 的效率是最高的.
作者: samuraiofU    时间: 2008-2-3 13:01

提示: 作者被禁止或删除 内容自动屏蔽
作者: sky5    时间: 2008-2-3 14:55     标题: 回复 34# 的帖子

可能是供人研究用的吧

PS:感谢N版了case是快,可是不能什么时候都case啊,如果是64进制点算啊

[ 本帖最后由 sky5 于 2008-2-3 14:57 编辑 ]
作者: needed    时间: 2008-2-3 22:41

既然16位可以case
  64位也可以case
作者: 懒觉    时间: 2008-2-7 12:25

效果灰常明显
作者: 81635631    时间: 2008-2-7 12:53

我知道了,MT的用户群是普通用户,TW的用户群是电脑高手

哈哈.我也成高手了

用了一段时间. 效果还是有的.
作者: livesweet    时间: 2008-2-14 21:22

看似很强大,但是看不懂,不过要下载,用完在来说。
作者: 东方皇宇    时间: 2008-2-15 10:55

只觉得杂草是个牛逼人
作者: xqgxs    时间: 2008-5-3 23:28

想学习学习这是个什么意思,对我们普通上网的人搞网速有用吗?
作者: 52twb    时间: 2008-5-4 08:02

学习了。 一下,收藏了。
作者: zhangguo82    时间: 2008-5-4 13:31

安装前后对比

426
16
作者: 小絮    时间: 2008-5-4 19:29

呵呵,这个插件对于脚本多的网站作用是比较大的,例如:足球比分网之类的,那些网站每隔几秒钟就运行一次脚本,用了这个插件后爽多啦
作者: cosmic0062    时间: 2008-5-4 20:06

用那个过滤规则试试看看
作者: OK1985    时间: 2008-5-4 20:27

  确实有用,打开SINA,163这样的大页面,效果明显~不过刷新后好像不起作用了

[ 本帖最后由 OK1985 于 2008-5-4 20:29 编辑 ]
作者: 小絮    时间: 2008-5-4 23:25

呵呵,过滤规则确实是对本地网页无效,不过可以通过iis来测试
作者: hzp123    时间: 2008-5-5 07:49

没有看明白怎么使用这个东西
作者: hnist    时间: 2008-5-5 08:38

牛人多多啊,只有膜拜的份啊,嘿嘿。
作者: finix    时间: 2008-5-5 11:26

顶。 谢谢楼主的研究
作者: finalflower    时间: 2008-5-5 12:04

提示: 作者被禁止或删除 内容自动屏蔽
作者: sky5    时间: 2008-5-5 12:07

这个插件出来很久了,为什么现在才有人发现好用,才开始热起来?我想这个和插件区的“改版”有关吧
作者: cpas    时间: 2008-5-5 14:09

天啊,还有这等牛人。
作者: LIGERZERO    时间: 2008-5-5 21:24

谢谢分享~
作者: 杂草    时间: 2008-6-4 09:49

改进了一下,见顶楼。
作者: pad88    时间: 2008-9-18 15:11

俺只是来凑个热闹,对JS不懂,高手如云呀。
作者: vokins    时间: 2008-9-24 18:10

使用过滤规则后无法正常使用百度贴吧,不能显示验证码
作者: xwhyc    时间: 2008-9-24 19:38

使用过滤规则后,http://www.greendown.cn下载地址被屏蔽了
作者: 谁用双鞭暴打爱    时间: 2008-9-25 00:25

插件+过滤规则 的时候,天涯论坛浏览不正常——所有文字和图片都居中了
作者: VISONEDISON    时间: 2008-9-27 20:55

看不懂啊
作者: aizhiq    时间: 2008-10-10 09:54

如果页面重新刷性一次 效果有恢复到以前一样 没有提示效果
作者: chuchun    时间: 2008-10-10 18:17

绝对的好东西
作者: drogonly    时间: 2008-10-12 16:39

受用··
慢慢学习中 感谢楼主!
作者: clock    时间: 2008-10-15 17:36

原帖由 xwhyc 于 2008-9-24 19:38 发表 http://bbs.ioage.com/cn/images/common/back.gif
使用过滤规则后,http://www.greendown.cn下载地址被屏蔽了

呵呵,我的很正常哦
作者: pauluck    时间: 2008-11-12 14:13

伟大的插件,本来不想装任何插件,看到这个,我装了
作者: gibbon23    时间: 2008-12-10 00:53

呵呵,支持楼主哇
作者: gn123    时间: 2008-12-10 02:57

没看懂,不知道效果如何。
作者: xiaolongkun0    时间: 2008-12-10 05:52

确实流畅多了
作者: gn123    时间: 2008-12-11 17:24

试用一下,确实流畅多了。但是有点小毛病,就是在网页上不能自动转换图片显示了,得自己点击显示。
作者: llama198011    时间: 2008-12-26 16:16

谢谢,楼主,这个插件真的不错可是还是没未能解决我的问题
作者: huge1005016068    时间: 2008-12-28 20:54

怎么不能下载 不让我用啊
作者: 杂草    时间: 2009-2-18 17:13

刚刚发现parent不能这样处理,否则很多页面的脚本会出现“权限不足”的错误。
所以我修改了顶楼的内容。
作者: royallin    时间: 2009-2-19 00:12

顶一下,下来用用
作者: fendouys2015    时间: 2009-3-19 00:53

此等高深好东西一定是要顶的
作者: vokins    时间: 2009-6-21 10:07

本帖最后由 vokins 于 2009-6-21 12:11 编辑
  1. #ex#<\/head>([\r\n]+)###<script language="Javascript">/*@cc_on eval(function(props){var code=[];for(var i=0;i<props.length;i++){var prop=props[i];window['_'+prop]=window[prop];code.push(prop+'=_'+prop)}return 'var '+code.join(',');}('document top setInterval clearInterval setTimeout clearTimeout alert confirm prompt open close showModalDialog showModelessDialog'.split(' '))); @*/</script>$1</head>$1
复制代码
最新的,过滤规则实现,主贴上面的少了一个i,备份
作者: tttwwy    时间: 2009-6-21 11:52

#ex#([\r\n]+)###/*@cc_on eval(function(props){var code=[];for(var i=0;i
vokins 发表于 2009-6-21 10:07 http://bbs.ioage.com/cn/images/common/back.gif

请问,与主帖小草那个有什么区别
作者: vokins    时间: 2009-6-21 11:57

76# tttwwy

主贴上面黑名单那个比090220跟新的那个插件形式里面的内容少了一个“【i】”,所以显示有问题,至少在我这里这样,改成上面那个就好了
作者: tttwwy    时间: 2009-6-21 12:06

76# tttwwy

主贴上面黑名单那个比090220跟新的那个插件形式里面的内容少了一个“【i】”,所以显示有问题,至少在我这里这样,改成上面那个就好了
vokins 发表于 2009-6-21 11:57 http://bbs.ioage.com/cn/images/common/back.gif


顺便问一下,加入了这条规则
是不是能提高页面加载过程中JS执行效率?
作者: vokins    时间: 2009-6-21 12:11

78# tttwwy

详细内容还是咨询楼主,ms是可以加速加载,而不是下载,我也不清楚哇
作者: cris    时间: 2009-6-21 12:56

不太懂的说。。什么叫JS代码,举个js代码比较多的网页例子好吗
另外主贴好几个代码,我到底用哪个?哪个是最终版?
作者: 天似无痕    时间: 2009-6-21 13:53

应该是个不错的插件吧,实际效果不知怎么体会,呵呵
作者: 天似无痕    时间: 2009-6-21 14:25

打开一些经常打开的网页,会出现第一次无法打开,刷新之后能打开的问题,不知道是什么缘故??
作者: 天似无痕    时间: 2009-6-21 15:43

本帖最后由 天似无痕 于 2009-6-21 16:01 编辑

http://wd-testnet.world-direct.a ... funo/jsTimeTest.htm
JS执行效率测试
大家试试,有改善吗?
作者: AY    时间: 2009-6-21 19:52

83# 天似无痕
的确可以加快取得 window.xxx 对象的速度,比如 document (等如 window.document)。正如 LZ 提供的测试,取 10 万次 document 对象可以快 100~200 微秒。

但当然,在实际应用时效果就微乎其微了,那有 JS (那怕是测试) 会取数以万次的 window.xxx 对象。
作者: 526716790    时间: 2009-6-21 20:23

本帖最后由 526716790 于 2009-6-21 20:31 编辑

84# AY
那也就是说我们没有必要安装这个插件咯~
这么好的插件,世界之窗应该吸取呀~~,把它集成在theworld主程序里~

ps:“插嘴 by 小絮
这个插件可以用过滤规则来实现:”


的意思是复制那些代码可以代替插件?
作者: 天似无痕    时间: 2009-6-22 08:51

83# 天似无痕  
的确可以加快取得 window.xxx 对象的速度,比如 document (等如 window.document)。正如 LZ 提供的测试,取 10 万次 document 对象可以快 100~200 微秒。

但当然,在实际应用时效果就微乎其微了 ...
AY 发表于 2009-6-21 19:52 http://bbs.ioage.com/cn/images/common/back.gif


问一下AY或其他知道的兄弟们,如何取消浏览器 执行JS脚本 的提示??也就是不经询问,直接运行
作者: yyl1200    时间: 2009-6-22 13:06

测试有一定的效果。
作者: 失踪日记    时间: 2009-6-22 13:13

还是用
那个插件好过过滤规则
作者: 失踪日记    时间: 2009-6-24 00:42

有缺点额.用了这个插件,我QQ邮箱点里面的邮件没反应,不能打开
作者: sbyguli    时间: 2009-6-27 04:42

这个要顶啊,好东西!
作者: richalon.wang    时间: 2009-7-7 09:32

个人感觉用插件,好于用过滤规则。
作者: 失踪日记    时间: 2009-7-8 17:32

个别网站出现图像不显示.一些对话框不出来,继续关注更新
作者: cksuperxlh    时间: 2009-7-8 17:48

不是很明白啊.....
作者: 失踪日记    时间: 2009-8-2 23:27

还继续更新么
作者: vcAngel    时间: 2009-8-27 03:08

最近用的规则好像都把这些剔除了
作者: 221234    时间: 2010-1-23 22:54

杂草大大的 过滤规则 貌似有问题 , 到像163什么的很多网站 都不能正确显示切换页面什么的。75楼说杂草大大的规则少了个 [i] 不知道正确不正确?
作者: 卜卜口    时间: 2010-2-4 12:41

看不懂,想知道作用及用法
作者: hua761215    时间: 2010-2-7 12:24

谢谢分享,收藏了
作者: zhb5615    时间: 2010-2-8 08:15

支持一下楼主的
作者: grku    时间: 2010-2-13 22:40

不懂代码,但是能增加效率的东西是在太好了,谢谢楼主分享。




欢迎光临 世界之窗论坛 (http://bbs.theworld.cn/) Powered by Discuz! 7.2