随笔-57  评论-129  文章-0  trackbacks-0
循环反转示例:

  for(var i = 0;i<data.length;i++){
    
//.
  }
  
//反转后代码
  for(var i = data.length-1;i>=0;i--){
    
//.
  }

这类优化的作用是明显的,但是具体有多大作用呢?

用一个长度为100 000 的数组测试一下:
515/313
500/313
516/312
516/328
516/328

可见,循环反转后,只需要原来3/5的时间.
但是,这种东西到底有多大价值?FF上200次循环仅需要1毫秒的时间.所以,个人认为,只要循环的内容不是太长,使用不算非常频繁,那么没有太大必要.
加入循环的长度需要通过函数取得,且不变,那么,反转的效率还是可观的,在IE上,函数调用消耗是普通操作的十多倍.

测试代码:
var incTime = 0;
var decTime = 0;
var inc = 0;
var data = new Array(10*10000);
//while(inc++<50)
{
  
var t1 = new Date();
  
for(var i = 0;i<data.length;i++){
  }
  
var t2 = new Date();
  
for(var i = data.length-1;i>=0;i--){
  }
  
var t3 = new Date();
  incTime
+=(t2-t1);
  decTime
+=(t3-t2);
}

prompt(
"incTime/decTime",incTime +'/'+decTime)


posted on 2007-05-31 12:30 金大为 阅读(891) 评论(5)  编辑  收藏 所属分类: JavaScript

评论:
# re: javascript 性能测试系列:循环反转的效果 2007-05-31 15:07 | MagicA
是反转产生的效果还是避免每次取length的效果?  回复  更多评论
  
# re: javascript 性能测试系列:循环反转的效果 2007-06-01 09:30 | DoubleHeart
还真是执行效率的差别,不是取length的差别
我把代码改成这样:

var incTime = 0;
var decTime = 0;
var inc = 0;
var data = new Array(10*10000);
//while(inc++<50)
{
var t1 = new Date();
for(var i = 0, num = data.length; i < num; i++){
}
var t2 = new Date();
for(var i = data.length-1; i >= 0; i--){
}
var t3 = new Date();
incTime+=(t2-t1);
decTime+=(t3-t2);
}

alert("incTime/decTime => " + incTime +'/'+decTime);


执行后,还是“反转循环”后的执行效率要高不少,IE下基本上维持在1:3,FF3beta版下基本上维持在1:2的情况(倒序:顺序)。  回复  更多评论
  
# re: javascript 性能测试系列:循环反转的效果 2007-06-01 10:20 | MagicA
that is an interesting topic, let's do more
1. 扩大data的元素,因为采样太小的话,随机性较强
2. 把取length的代码放在前面,脱离计时区域
3. 试着颠倒两个for的顺序
then you get the following conclusion
. they are almost the same

have a try

------------------------------------------------
var incTime = 0;
var decTime = 0;
var inc = 0;
var data = new Array(100*10000);
//while(inc++<50)
{
var len = data.length;
var t1 = new Date();
for(var i = len; i > 0; i--){}
var t2 = new Date();
for(var i = 0; i < len; i++){}
var t3 = new Date();
incTime+=(t2-t1);
decTime+=(t3-t2);
}

alert("incTime/decTime => " + incTime +'/'+decTime);  回复  更多评论
  
# re: javascript 性能测试系列:循环反转的效果 2007-06-01 17:22 | 金大为
@DoubleHeart
for(var i = 0, num = data.length; i < num; i++){
}
var t2 = new Date();
for(var i = data.length-1; i >= 0; i--){

你这样是少取了一次属性,但是,你还是取了一次变量,取变量估计也要比常量耗时的:)  回复  更多评论
  
# re: javascript 性能测试系列:循环反转的效果 2007-06-03 18:40 | 金大为
@emu
挑刺专家啊,你说的没错:

不过对我来说,我一般懒得去申明那个变量,而且对于for循环,最常见的也就是对数组循环.所以我感觉我上面的测试还有有一定的常见性.
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: