呀...........标题居然有错别字, ....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>

解决方案 »

  1.   

    晕倒,哈,上来就看到个散分贴,高兴ing..
      

  2.   

    问题是你用了数组的join方法
    这个以前有一些帖子说过这个
      

  3.   

    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++){}
      

  4.   

    哦, 谢谢指点...结论出来了....是 正则引擎的问题, 应该是 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>