迷域, 不同脚本引擎, 相同的写法, 效率怎么送别这么大呀....

btbtd 2007-05-23 12:59:10
最近在做一些效率测试,,,,
得出的结论是 IE 的脚本引擎最稳定, Opera 的最不稳定, Firefox 的处于中间....


运行下面的代码, 在 以上提到的浏览器上运行...
真有点迷域呀...


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[

var iUnder = 1, iOver = 200;

var StartTime = new Date();

fRndNoRept(iUnder, iOver)

var EndTime = new Date();

defaultStatus =
"fRndNoRept("+iUnder+", "+iOver+"): "+(EndTime-StartTime);
;

var StartTime = new Date();

fRandomNoRepeat(iUnder, iOver)

var EndTime = new Date();

defaultStatus +=
" fRandomNoRepeat("+iUnder+", "+iOver+"): "+(EndTime-StartTime);
;

fRandomNoRepeat(iUnder, iOver);

function fRandomNoRepeat(iUnder, iOver)
{
if(!iUnder) iUnder = 100;
if(!iOver)
{
iOver = iUnder;
iUnder = 1;
}
iOver -= 0;
iUnder -= 0;

var ar = [];
var iArLenCount = 0;
var arLen = iOver-iUnder+1;
var iUnderCount = iUnder;
while(iUnderCount<=iOver)
{
ar[iArLenCount++] = iUnderCount++;
}

var str = ar.join();

var iMax = iOver*100;
var iCount = 0;

var arFinal = [];
var iarFinalCount = 0;
var iTemp = null;

while(/[0-9]/.test(str))
{
var Re = new RegExp("(\\b"+fRandomBy(iUnder,iOver)+"\\b)", "");
//alert(iTemp)

str =
str.replace
(
Re
,
function($1, $2)
{
ar[$2] = $2;
}
);
}
return ar;

function fRandomBy(under, over)
{// shawl.qiu script
switch(arguments.length)
{
case 1: return parseInt(Math.random()*under+1);
case 2: return parseInt(Math.random()*(over-under+1) + under);
default: return 0;
} // end switch
} // end function fRandomBy
} // end function fRandomNoRepeat

function fRndNoRept(iUnder, iOver)
{// shawl.qiu script
if(!iUnder&&iUnder===false) var iUnder=100;
if(!iOver){
var iOver=iUnder;
iUnder=1;
}
iUnder -=0; iOver -= 0;
var ar=[];
var iArLen=temp=0;
var bln;
var iMax = iOver-iUnder+1;

while(iArLen<iMax)
{
bln=true;
temp=fRandomBy(iUnder, iOver);
var iLenCount = 0;
while(iLenCount++<iArLen)
{
if(ar[iLenCount-1]==temp)
{
bln=false;
break;
}
} // end while 1
if(bln)ar[iArLen++]=temp;
} // end while
return ar;

function fRandomBy(under, over)
{// shawl.qiu script
switch(arguments.length)
{
case 1: return parseInt(Math.random()*under+1);
case 2: return parseInt(Math.random()*(over-under+1) + under);
default: return 0;
} // end switch
} // end function fRandomBy
} // end function fRndNoRept
//]]>
</script>
</head>
<body>

</body>
</html>
...全文
342 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
btbtd 2007-05-23
  • 打赏
  • 举报
回复
....
貌似问题清楚了...又是散分帖....
楼下开始接分吧, 今天结....
meizz 2007-05-23
  • 打赏
  • 举报
回复
确实,IE的正则处理是所有浏览器里最牛的!
yixianggao 2007-05-23
  • 打赏
  • 举报
回复
恩,看高手过招就是爽!

继续学习!

JF,哈
btbtd 2007-05-23
  • 打赏
  • 举报
回复
哦, 谢谢指点...

结论出来了....

是 正则引擎的问题, 应该是 MS 拥有世界上最牛B的正则引擎的原因


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[
var str = "";
var iUnder = iNext = 1, iOver = 1000;
while(iUnder<iOver)
{
str += iUnder++ +",";
}

var StartTime = new Date();

while(/[0-9]/.test(str))
{
var Re = new RegExp("(\\b"+iNext++ +"\\b)", "");

str =
str.replace
(
Re
,
function($1, $2)
{
}
);
}

var EndTime = new Date();

defaultStatus =
" re test: "+(EndTime-StartTime);
;
//]]>
</script>
</head>
<body>

</body>
</html>
meizz 2007-05-23
  • 打赏
  • 举报
回复
20.1 循环体内/外定义变量(没多大差别)
20.2 循环体嵌套大小放置问题(IE里没什么差别,FF有区别)
20.3 for vs while (没有差别)
20.4 遍历数组使用 while or for in or for next(for...in最慢,while与for没差别)
20.5 遍历数组时, 是否在循环体内定义当前索变量(你这种测试设计就有问题)
for(var i=0, n=a.length; i<n; i++){}
joegu 2007-05-23
  • 打赏
  • 举报
回复
jf
btbtd 2007-05-23
  • 打赏
  • 举报
回复
哦, 谢谢版版,.. 待会我试一下是否如此............
hbhbhbhbhb1021 2007-05-23
  • 打赏
  • 举报
回复
问题是你用了数组的join方法
这个以前有一些帖子说过这个
muxrwc 2007-05-23
  • 打赏
  • 举报
回复
晕倒,哈,上来就看到个散分贴,高兴ing..
yixianggao 2007-05-23
  • 打赏
  • 举报
回复
一早就看到搞这么一大堆代码,会得脑淤血的,哈

MS 财大气粗,当然有钱请高人,做出来的东西怎么会差?!
dongsj8325 2007-05-23
  • 打赏
  • 举报
回复
studying。。。。。。。。。
gameboy766 2007-05-23
  • 打赏
  • 举报
回复
关注
muxrwc 2007-05-23
  • 打赏
  • 举报
回复
:D
btbtd 2007-05-23
  • 打赏
  • 举报
回复
...哦哦, 还望各位大侠多多指教呀...近期开始要深入学习算法了...
现在处于热身阶段....
btbtd 2007-05-23
  • 打赏
  • 举报
回复
呀...........标题居然有错别字, ....

20. 效率测试
20.1 循环体内/外定义变量 (结论: 外)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[

// 结论: 应该在循环体外定义变量

var iTestLen = 100000;

defaultStatus =
"Def In Obj: "+fDefInObj(iTestLen)
+" Def Out Obj: "+fDefOutObj(iTestLen);
;

function fDefInObj(iLen)
{
var iCount=0;
var StartDt = new Date();
while(iCount++<iLen)
{
var Obj = new Object();
var i = 0;
}
var EndDt = new Date();
return EndDt - StartDt;
}

function fDefOutObj(iLen)
{
var iCount=0;
var StartDt = new Date();
var Obj, i;
while(iCount++<iLen)
{
Obj = new Object();
i=0;
}
var EndDt = new Date();
return EndDt - StartDt;
}
//]]>
</script>
</head>
<body>

</body>
</html>


20.2 循环体嵌套大小放置问题 (结论: 跨度越大, 放在越外)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[
// 结论, 应该把跨度越大的循环放在越外层
var iTestLen = 1000000;

defaultStatus =
""
+" fLoop(100, 100000): "+fLoop(100, 10000)
+" fLoop(100000, 100): "+fLoop(10000, 100)
;

function fLoop(iOut, iIn )
{
var StartDt = new Date();
var iOutCount = 0;
while(iOutCount++<iOut)
{
var iInCount = 0;
while(iInCount++<iIn)
{

}
}
var EndDt = new Date();
return EndDt - StartDt;
}
//]]>
</script>
</head>
<body>

</body>
</html>


20.3 for vs while (结论: while 效率更高)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[

// 结论: 应该改 for 为 while

var iTest = 100000;

var StartTime = new Date();
for(var i=0; i<iTest; i++)
{

}
var EndTime = new Date();

defaultStatus = "for: "+(EndTime-StartTime);

var StartTime = new Date();

var i=0;
while(i++<iTest)
{

}

var EndTime = new Date();
defaultStatus += " while: "+(EndTime-StartTime);
//]]>
</script>
</head>
<body>

</body>
</html>


20.4 遍历数组使用 while or for in or for next (结论: while 最快, for in 最慢)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[

// 结论: 遍历数组应该使用 while

var ar = new Array(100000).join("x#").split("#");

defaultStatus =
""
+" ar.length: "+ar.length
+" fForIn(ar): "+fForIn(ar)
+" fFornext(ar): "+fFornext(ar)
+" fWhile(ar): "+fWhile(ar)
;

function fForIn(ar)
{
var StartDt = new Date();
for(var i in ar)
{

}
var EndDt = new Date();
return EndDt - StartDt;
}

function fFornext(ar)
{
var StartDt = new Date();
var iLen = ar.length;
for(var i =0; i<iLen; i++)
{

}
var EndDt = new Date();
return EndDt - StartDt;
}

function fWhile(ar)
{
var StartDt = new Date();
var iLen = ar.length;
var iCount = 0;
while(iCount++<iLen)
{
}
var EndDt = new Date();
return EndDt - StartDt;
}


//]]>
</script>
</head>
<body>

</body>
</html>

20.5 遍历数组时, 是否在循环体内定义当前索变量 (结论: 不定义变量)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[

// 结论: 应该先定义一个取数组长度的变量, 再在变量上递加

var iLen = 100000;

defaultStatus =
""
+" fManualLen(iLen): "+fManualLen(iLen)
+" fAutoLen(iLen): "+fAutoLen(iLen)
;

function fManualLen(iLen)
{
var a = [];

var iCount = 0;
var StartDt = new Date();
while(iCount<iLen)
{
a[iCount] = iCount;
iCount++;
}
var EndDt = new Date();
return EndDt - StartDt;
}

function fAutoLen(iLen)
{
var a = [];
var iCount = 0;
var StartDt = new Date();
while(iCount<iLen)
{
var iIndex = a.length;
a[iIndex] = iIndex;
iCount++;
}
var EndDt = new Date();
return EndDt - StartDt;
}

//]]>
</script>
</head>
<body>

</body>
</html>

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧