发现一个很奇怪的结果:
------------------------------------------
IE6.0下测试:
----------------------------------------------
数组长度:100000
传统循环法耗时 4172 毫秒!检索的结果:检索到 15 个记录!
正则匹配法耗时 141 毫秒!检索的结果:检索到 15 个记录!
---------------------------------------------------------
Firefox1.5下测试:
--------------------------------------------------
数组长度:100000
传统循环法耗时 687 毫秒!检索的结果:检索到 11 个记录!
正则匹配法耗时 6063 毫秒!检索的结果:检索到 11 个记录!
------------------------------------------
IE6.0下测试:
----------------------------------------------
数组长度:100000
传统循环法耗时 4172 毫秒!检索的结果:检索到 15 个记录!
正则匹配法耗时 141 毫秒!检索的结果:检索到 15 个记录!
---------------------------------------------------------
Firefox1.5下测试:
--------------------------------------------------
数组长度:100000
传统循环法耗时 687 毫秒!检索的结果:检索到 11 个记录!
正则匹配法耗时 6063 毫秒!检索的结果:检索到 11 个记录!
要真正看“数组”而不是“字符数组”的效率,是不可以这样测试的。试试:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> emu's test </TITLE>
<META NAME="Author" CONTENT="emu">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
var n = 100000; //数组的最大容量
var a = new Array(n);
for(var i=0; i<n; i++)
a[i] = Math.random() ;function traditional(){
var b = new Array();
var begin = new Date().getTime();
for(var i=0; i<n; i++)
if(a[i]>=0.999)
b[b.length] = a[i];
return "传统循环法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
}
function meizz(){
var begin = new Date().getTime();
var ch = "\x0f"
var s = a.join(ch);
var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
var b = s.match(r); s = "";
return "正则匹配法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
}</SCRIPT>
<button onclick="output.innerHTML+=traditional();">test traditional</button>
<button onclick="output.innerHTML+=meizz();">test meizz</button>
<div id=output style="width:600;height:400;border:1 solid gray;overflow:scroll"></div>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE> emu's test </TITLE>
<META NAME="Author" CONTENT="emu">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
var n = 100000; //数组的最大容量
var a = new Array(n);
for(var i=0; i<n; i++)
a[i] = Math.random() ;function traditional(){
var b = new Array();
var begin = new Date().getTime();
for(var i=0; i<n; i++)
if(a[i]>=0.999)
b[b.length] = a[i];
return "传统循环法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
}
function meizz(){
var begin = new Date().getTime();
var ch = "\x0f"
var s = a.join(ch);
var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
var b = s.match(r); s = "";
return "正则匹配法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
}</SCRIPT>
<button onclick="document.getElementById('output').innerHTML+=traditional();">test traditional</button>
<button onclick="document.getElementById('output').innerHTML+=meizz();">test meizz</button><BR><BR>
<div id=output style="width:600;height:400;border:1px solid gray;overflow:scroll"></div>
</BODY>
</HTML>其实js的数组处理还是很快的,不能把字符串处理(indexOf)的帐算到array头上来。
<input type="button" value="数组初始华" onclick="txt.innerHTML = array_init()"><br>
<input type="button" value="传统循环" onclick="txt.innerHTML += method_old()">
<input type="button" value="正则匹配" onclick="txt.innerHTML += method_new()">
<div id="txt"></div><SCRIPT LANGUAGE="JavaScript">
var txt = document.getElementById("txt");
var n, a = new Array();function array_init()
{
n = parseInt(document.getElementById("count").value);
a.length = 0;
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
return "数组长度:"+ n;
}function method_old()
{
var begin = new Date().getTime();
var b = new Array();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0.9999")==0)
{
b[b.length] = a[i];
}
}
return ("<br>传统循环法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索的结果:<strong title='"+ b.join(" ")
+"'>检索到 "+ b.length +" 个记录!</strong>");
}function method_new()
{
var begin = new Date().getTime();
var b = new Array();
var s = a.join("\x0f");
var r = new RegExp().compile("0\\.9999\\d+", "g");
b = s.match(r); s = "";
return ("<br>正则匹配法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索的结果:<strong title='"+ b.join(" ")
+"'>检索到 "+ b.length +" 个记录!</strong>");
}
</SCRIPT>
数组长度:10000
传统循环法耗时 719 毫秒!检索的结果:检索到 1 个记录!
正则匹配法耗时 16 毫秒!检索的结果:检索到 1 个记录!
传统循环法耗时 718 毫秒!检索的结果:检索到 1 个记录!
正则匹配法耗时 31 毫秒!检索的结果:检索到 1 个记录!
a[i] = Math.random() +"";
a[i]=Math.random().toString();
在IE速度差不多。在join里
大梅用的是这个字符吧,我想javascript本身是unicode编码会不会用其他编码速度有影响,用了其他方法好象没什么区别
var s = a.join("\x0f");还有用正则匹配的方法,多点几下有的时候时间会有多少的变化吧
基本都是相差16的倍数。说了很多没用的,呵呵。
var begin = new Date().getTime();
var ch = "\x0f"
var s = a.join(ch);
var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
var b = s.match(r); s = "";
return "正则匹配法耗时 "+ (new Date().getTime() - begin)
+" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
}
<HTML>
<HEAD>
<TITLE> test join </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var n = 500000
var a = new Array(n)
function test(){
for(var i=0;i<n;i++)
a[n]=Math.random(); var d = new Date();
var st = a.join("\x0f");
alert(new Date()-d) for(var i=0;i<n;i++)
a[n]=Math.random()+""; var d = new Date();
var st = a.join("\x0f");
alert(new Date()-d)}
//-->
</SCRIPT>
<button onclick="test()">test</button>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE> test join </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var n = 50000
var a = new Array(n)
function test(){
for(var i=0;i<n;i++)
a[i]=Math.random(); var d = new Date();
var st = a.join("\x0f");
alert(new Date()-d) for(var i=0;i<n;i++)
a[i]=Math.random()+""; var d = new Date();
var st = a.join("\x0f");
alert(new Date()-d)}
//-->
</SCRIPT>
<button onclick="test()">test</button>
</BODY>
</HTML>唉,肥手指
上面的测试两个地方敲错了一个字母,是我的错。梅花雨的结论是对的。怎么就改不了这个肥手指呢?
>> 怎么就改不了这个肥手指呢?
emu(祝福后山) 在這裡敲錯道沒什麼問題,可以很快改過來,但有些問題就麻煩:東莞市石碣鎮交通局一個姓陳的判官,在接手一次交通事故中,第一個星期說被撞人有理,第二個星期說被撞人無理,真是自己打自己的嘴巴,分明就是欺軟怕硬,收了本地人的好處,欺負外地人。後來給那外地人心裡留下了很深的陰影。沒戴頭盔的摩托車司機以飛快的速度撞到經過十字路口的行人,路上留下了道近十米的剎車痕,後來把頭給撞破了,那姓陳的矮胖官伙,開始說那本地人不尊守交通規則,過了一個星期再叫去說行人在沒人行斑馬條的路口要讓機動車,所以責任在行人。
天哪,哪時他不要步行過馬路,不然的話開飛車撞飛那吃得肥流油的陳叛官,依他說的“有理”。說離題了,聽到“弄錯”一詞,想起了四年前記憶還是猶新的同學被撞場面。
var a = new Array(n);
for(var i = 0; i < n; i++) a[n] = Math.random();上面这个50w的ok。var a = new Array(
"aaa",
"aaa",
"aaa",
...
"aaa"
);这个哪怕只有10w个元素都会报错。Any idea? Thanks!
function createTable(){
document.getElementById("Detail").dataSrc=""; // release from Data Binding
var strtd=""; //faster
var etTypeXml= BaseXmlDom.selectNodes("//root/ettype"); //按照提成类别fname排
var detailXml = XmlDomDetail.selectNodes("//root/PROCOMM_DETAIL"); // 那么新的XML新节点也应该按照提成类别fname排
var mtXmllen = etTypeXml.length; // 3 ettypes
var lendetail = detailXml.length; // 4 childnodes
var widHead = 40/mtXmllen;
//Create thead top
var strTmp111 = " ,";
var strTmp112 = "15,"
for (var i=0;i<mtXmllen;i++) // mtXmllen=3
{
var mtName= etTypeXml(i).getAttribute("FNAME");
strTmp111 += "" + ","; // (ettypeID) hide column ,to save ettype
strTmp111 += mtName + ",";
strTmp111 += "" + ",";
strTmp112 += "0" + "," ; // (ettypeID) hide column,width:1
strTmp112 += widHead + ",";
strTmp112 += widHead + ",";
}
strTmp111 += "" + "," + "" + ","; // fscid
strTmp112 += "0" + "," + "0" + ","; //fproductid
strTmp111 = strTmp111.substring(0,strTmp111.length-1);
strTmp112 = strTmp112.substring(0,strTmp112.length-1);
var arr111=strTmp111.split(",");
var arr112=strTmp112.split(",");
for(var j=0;j<arr111.length;j++) //12
{
tdobj=document.createElement("TD");
tdobj.style.width=arr112[j]+"%";
with(tdobj)
{
if (j!=0 && ( (j+2 ) % 3 )==0 ) // j不为0且 模为0时才执行
{
strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
}
else
{
strtd = "<font color='#FFFFFF' size='2px'>" + arr111[j] + "</font>";
}
}
tdobj.innerHTML=strtd;
document.all.mytop.appendChild(tdobj);
}
//Create thead myhead
strTmp111 = "产品名称,";
strTmp112 = "15,"
for (var i=0;i<mtXmllen;i++) //
{
var mtName= etTypeXml(i).getAttribute("FNAME");
strTmp111 += "" + ","; // hide column ,to save ettype
strTmp111 += "原标准,";
strTmp111 += "调整金额,";
strTmp112 += "0" + "," ; // hide column,width:1
strTmp112 += widHead + ",";
strTmp112 += widHead + ",";
}
strTmp111 += "" + "," + "" + ","; // hide column,to save fscid
strTmp112 += "0" + "," + "0" + ","; // hide column,to fproductid
strTmp111 = strTmp111.substring(0,strTmp111.length-1);
strTmp112 = strTmp112.substring(0,strTmp112.length-1);
var arr111=strTmp111.split(",");
var arr112=strTmp112.split(",");
for(var j=0;j<arr111.length;j++) //12
{
tdobj=document.createElement("TD");
tdobj.style.width=arr112[j]+"%";
with(tdobj)
{
if (j!=0 && ( (j+2 ) % 3 )==0 ) // j不为0且 模为0时才执行
{
strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
}
else
{
strtd = "<font color='#FFFFFF' size='2px'>" + arr111[j] + "</font>";
}
}
tdobj.innerHTML=strtd;
document.all.myhead.appendChild(tdobj);
}
strTmp111="FPRODUCTNAME,";
strTmp112="15,";
for (var i=0;i<mtXmllen;i++) // for: the num of ettype
{
strTmp111 += "FCTYPE_" + i + ","; // hide column ,to save ettype
strTmp111 += "FMONEY_" + i + ",";
strTmp111 += "FCHGMONEY_" + i +",";
strTmp112 += "0" + "," ; // hide column, width:0
strTmp112 += widHead + ",";
strTmp112 += widHead + ",";
}
strTmp111 += "FSCID" + "," + "FPRODUCTID" + ","; // fscid
strTmp112 += "0" + "," + "0" + ",";
strTmp111 = strTmp111.substring(0,strTmp111.length-1);
strTmp112 = strTmp112.substring(0,strTmp112.length-1);
arr111=strTmp111.split(",");
arr112=strTmp112.split(",");
for (var j=0;j<arr111.length;j++) //the length of array
{
tdobj=document.createElement("TD");
tdobj.style.width=arr112[j]+ "%";
with(tdobj)
{
if (j!=0 && (j % 3 )==0 ) //模3是因为每对应一个门店类别有三列记录 % http://livedocs.macromedia.com/d ... p;file=08_ope27.htm
{
strtd = "<input name='chgmoney' style='border-style:groove;width:40px' type='text' dataFld= '" + arr111[j] + "' onclick='javascript:this.focus();this.select();' onblur='checkNum(this)' ></input>";
}
else if (( j==(3 * mtXmllen+1 ) ) || (j== (3 * mtXmllen+2) ) )
{
strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' dataFld= '" + arr111[j] + "'></div>";
}
else if (j!=0 && ( (j+2 ) % 3 )==0 )
{
strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
}
else
{
strtd = "<div style='width:98%;' dataFld= '" + arr111[j] + "'></div>";
}
}
tdobj.innerHTML=strtd;
document.all.mydata.appendChild(tdobj);
}
document.getElementById("Detail").dataSrc="#XmlDomDetail"; // rebilding
//数据绑定完毕解控件过程在readystate中
/*2005-12-28暂时方案*/
document.myform.style.cursor="default" ;
form_enable(true);
window.parent.frames("fleft").document.all("LockUI").style.display="none";
}