呀...........标题居然有错别字, ....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>
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>
这个以前有一些帖子说过这个
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++){}
<!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>