发现:用Enumerator来检索Collection,速度是原来两倍 不过说回来。访问一个元素所用时间是0.1ms和0.2ms而已关键还是靠循环里的操作所话的时间。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Enum:440,Coll:311Enum:421,Coll:250Enum:331,Coll:190 机器问题?Enum:341,Coll:290 应该是跟机器性能有关,我这里前者时间是后者的几乎1.5倍,可是偶的机器也不过是PIII 733 看这个撒:enum:3136,coll:10905var d1=new Date();for(var i=0;i<1000;i++){ var e=new Enumerator(document.all) for(;!e.atEnd();e.moveNext()) { if(e.item().className.toUpperCase()!="lower") continue; }}var d2=new Date();for(var i=0;i<1000;i++){ var coll=document.all; var len=coll.length; for(var j=0;j<len;j++) { if(coll.item(j).className.toUpperCase()!="lower") continue; }}var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join("")) 还有哦你们要拿个很多HTML元素的页面来测试哦。。而且要在window.onload后才测试。不然document.all.length你们能保证多少呢? 迷失,你刚才发的又测试了一下:enum:491,coll:230 我发个比较好的测试页吧。。:www.lostinet.com/temp/enum.htm我自己的机子是Enum:7420,Coll:27991里面的代码是:----------<body><script>document.write(MakeTableTree(3));function MakeTableTree(deep){ deep--; var html="<table border=1 style=border-collapse:collapse>"; for(var i=0;i<2;i++) { html+="<tr>"; for(var j=0;j<2;j++) { html+="<td>"+deep; if(deep>0) html+=MakeTableTree(deep); html+="</td>"; } html+="</tr>"; } html+="</table>"; return html;}</script></body><script>function window.onload(){alert("document.all.length:"+document.all.length);var d1=new Date();for(var i=0;i<1000;i++){ var e=new Enumerator(document.all) for(;!e.atEnd();e.moveNext()) { if(e.item().className.toUpperCase()!="lower") continue; }}var d2=new Date();for(var i=0;i<1000;i++){ var coll=document.all; var len=coll.length; for(var j=0;j<len;j++) { if(coll.item(j).className.toUpperCase()!="lower") continue; }}var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join(""))}</script> 我就是直接在这个贴子上执行的你的是:enum:3136,coll:10905而我的是enum:310,coll:356To Lostinet:你用这个贴子的方法http://expert.csdn.net/Expert/topic/1120/1120460.xml?temp=.8186304直接在这个贴子上执行看看。 这个是document.all.tags("TD")http://www.lostinet.com/temp/enum_td.htm和上面的结果也差好远。。 测试环境ie6+server 2000 打错了吧??Enum的才174??? http://www.lostinet.com/temp/enum_many.htm天啊。。当数量增加到一定程度,,差别太大了document.all.length:2734我只循环一次,时间是Enum:120,Coll:829270倍啊~~~ http://www.lostinet.com/temp/enum_prompt.htm6层Table的时候很极限了。(Enum:4xx,Coll:123xxx)包括所有的.className.toUpperCase()!="lower"Enum的时间还是极短. 不错,前面的要快2倍。win2000专业版,IE6.0.2800. 现在来解析一下为什么Enumerator的性能和Collection不同,为什么在Collection越大的时候,Enumerator的速度比Collection快很多。先去看看这个例子http://www.lostinet.com/temp/enum_add.htm这个例子在HTML开始的时候,就已经用Enum和Coll变量引用了Enumerator(document.all)和document.all然后在中途为document添加N个TABLE。最后面就对Enum和Coll进行循环取元素。(我还特意进行一次Enum.moveFirst())其中countEnum和countColl记录了循环的次数。最后的结果知道,Enum这个的内容,由其创建到结束都是4而Coll则在后面改动了。。所以,Enum是Coll的一个静态COPY。它一次过把Collection里的数据弄成一张列表。无论document有多少改动,它都是不变的。而Coll则引用着document.all,那么Coll.length,Coll.item是需要根据document的情况而定。每次算Coll.item()时,都要从新查找该位置的元素(或是其他算法,不过也比不上Enumerator那样明确是静态副本的。)。所以,如果不是异步地对元素进行列举,也不是中途进行元素的增加减少,或者是明确循环指定元素时,都应该用Enumrator来提高速度。 下面是Enumerator的静态和Collection的动态的使用上的区别:http://www.lostinet.com/temp/enum_select.htm在这个例子里。使用Enumerator,是一张静态的options的列表。用for(;!Enum.atEnd();Enum.moveNext())来进行对Enumerator的循环。用Enum.item()得到循环过程中的Option的引用。然后再用removeNode()来删除该Option而用Collection就不同了。因为在循环里面,是明确要把Collection的一个元素删除的。所以Coll.length是不断再变的。如果使用for(var i=0;i<Coll.length;i++)来进行对Coll的循环,那么将有一半的Option不能被删除掉。在例子中,是使用while(Coll.length)来进行循环测试的。因为只要Coll.length大于0,那么就可以删除Coll.item(0)。删除Coll.item(0)后,Coll.length也会减1当然,我想var len=Coll.length;for(var i=0;i<len;i++) Coll.item(0).removeNode(true);也是能够把所有的Option删除的 因为用法不同,将if(coll.item(j).className.toUpperCase()!="lower")改为if(coll[j].className.toUpperCase()!="lower")<body><script>document.write(MakeTableTree(5));function MakeTableTree(deep){ deep--; var html="<table border=1 style=border-collapse:collapse>"; for(var i=0;i<2;i++) { html+="<tr>"; for(var j=0;j<2;j++) { html+="<td>"+deep; if(deep>0) html+=MakeTableTree(deep); html+="</td>"; } html+="</tr>"; } html+="</table>"; return html;}</script></body><script>function window.onload(){alert("document.all.length:"+document.all.length);var d1=new Date(); var e=new Enumerator(document.all) for(;!e.atEnd();e.moveNext()) { if(e.item().className.toUpperCase()!="lower") continue; }var d2=new Date(); var coll=document.all; var len=coll.length; for(var j=0;j<len;j++) { if(coll[j].className.toUpperCase()!="lower") continue; }var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join(""))}</script> if(coll.item(j).className.toUpperCase()!="lower")改为if(coll[j].className.toUpperCase()!="lower")时间差不多啊是不是用coll.item(j)的时候,浏览器把coll作为一个对象,重新定位document中的element而用coll[j]的时候,浏览器把 coll看为一个简单数组呀。??? 恩。。这个是一个大的发现。我原想Coll[i]会比Coll.item(i)快的。但是也想不到会快那么多。 我去找找IE5.0+JScript5.0的机子。。试试。。 http://www.lostinet.com/temp/enum_ppt.htmhttp://www.lostinet.com/temp/enum_dppt.htm如果用coll(j)来访问,速度一样好快。。难道就是因为coll.item上慢了?? 事实上Enumerator和Collection来遍历的话,两者的数度应该是差不多,要说快的话应该是后者比前者快。因为Enumerator只是个枚举器,它的内部实现应该还是依赖于集合或者数组的遍历。搂主测试的数据其实是一种假象。应为两者的执行顺序不同,编译器等自己还有初始化和清理垃圾等的工作.如果把两者执行顺序调换一下,估计会得到不同的结果.这也正是其他各位测出数据跟楼主完全不同的原因!!! getJson 回调函数为什么不执行 普通button模拟表单提交功能 一个简单问题,大家帮忙哦! js 中 var abc={函数内容} 这种格式是什么意思 。 高人帮忙,关于document对象的, 请教如何将div做成屏幕居中,类似sina.com的首页那样? 今天看代码碰到的几个小问题(都进来看看,你们碰到过没有哦~) 怎样增强浏览器的功能 学习作用域链有个地方不明白,问问大家 请问有没有什么方法判断一个变量是不是数组??Thanks! 怎么样让浏览器的历史失效 日期判断问题。急有加分!
Enum:421,Coll:250
Enum:331,Coll:190
Enum:341,Coll:290
enum:3136,coll:10905var d1=new Date();
for(var i=0;i<1000;i++)
{
var e=new Enumerator(document.all)
for(;!e.atEnd();e.moveNext())
{
if(e.item().className.toUpperCase()!="lower")
continue;
}
}
var d2=new Date();
for(var i=0;i<1000;i++)
{
var coll=document.all;
var len=coll.length;
for(var j=0;j<len;j++)
{
if(coll.item(j).className.toUpperCase()!="lower")
continue;
}
}
var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join(""))
你们要拿个很多HTML元素的页面来测试哦。。
而且要在window.onload后才测试。
不然document.all.length你们能保证多少呢?
www.lostinet.com/temp/enum.htm我自己的机子是
Enum:7420,Coll:27991里面的代码是:
----------
<body><script>
document.write(MakeTableTree(3));
function MakeTableTree(deep)
{
deep--;
var html="<table border=1 style=border-collapse:collapse>";
for(var i=0;i<2;i++)
{
html+="<tr>";
for(var j=0;j<2;j++)
{
html+="<td>"+deep;
if(deep>0)
html+=MakeTableTree(deep);
html+="</td>";
}
html+="</tr>";
}
html+="</table>";
return html;
}</script></body>
<script>function window.onload()
{
alert("document.all.length:"+document.all.length);var d1=new Date();
for(var i=0;i<1000;i++)
{
var e=new Enumerator(document.all)
for(;!e.atEnd();e.moveNext())
{
if(e.item().className.toUpperCase()!="lower")
continue;
}
}
var d2=new Date();
for(var i=0;i<1000;i++)
{
var coll=document.all;
var len=coll.length;
for(var j=0;j<len;j++)
{
if(coll.item(j).className.toUpperCase()!="lower")
continue;
}
}
var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join(""))
}</script>
enum:3136,coll:10905
而我的是enum:310,coll:356
To Lostinet:你用这个贴子的方法
http://expert.csdn.net/Expert/topic/1120/1120460.xml?temp=.8186304直接在这个贴子上执行看看。
document.all.tags("TD")
http://www.lostinet.com/temp/enum_td.htm和上面的结果也差好远。。
ie6+server 2000
Enum的才174???
当数量增加到一定程度,,差别太大了document.all.length:2734
我只循环一次,时间是
Enum:120,Coll:829270倍啊~~~
6层Table的时候很极限了。(Enum:4xx,Coll:123xxx)
包括所有的.className.toUpperCase()!="lower"
Enum的时间还是极短.
http://www.lostinet.com/temp/enum_add.htm这个例子在HTML开始的时候,就已经用Enum和Coll变量引用了
Enumerator(document.all)和document.all然后在中途为document添加N个TABLE。最后面就对Enum和Coll进行循环取元素。
(我还特意进行一次Enum.moveFirst())
其中countEnum和countColl记录了循环的次数。最后的结果知道,
Enum这个的内容,由其创建到结束都是4
而Coll则在后面改动了。。所以,Enum是Coll的一个静态COPY。
它一次过把Collection里的数据弄成一张列表。
无论document有多少改动,它都是不变的。
而Coll则引用着document.all,
那么Coll.length,Coll.item是需要根据document的情况而定。
每次算Coll.item()时,都要从新查找该位置的元素(或是其他算法,不过也比不上Enumerator那样明确是静态副本的。)。所以,如果不是异步地对元素进行列举,也不是中途进行元素的增加减少,
或者是明确循环指定元素时,都应该用Enumrator来提高速度。
使用Enumerator,是一张静态的options的列表。
用for(;!Enum.atEnd();Enum.moveNext())来进行对Enumerator的循环。
用Enum.item()得到循环过程中的Option的引用。
然后再用removeNode()来删除该Option而用Collection就不同了。
因为在循环里面,是明确要把Collection的一个元素删除的。
所以Coll.length是不断再变的。
如果使用
for(var i=0;i<Coll.length;i++)
来进行对Coll的循环,那么将有一半的Option不能被删除掉。
在例子中,是使用while(Coll.length)来进行循环测试的。
因为只要Coll.length大于0,那么就可以删除Coll.item(0)。
删除Coll.item(0)后,Coll.length也会减1当然,
我想
var len=Coll.length;
for(var i=0;i<len;i++)
Coll.item(0).removeNode(true);也是能够把所有的Option删除的
if(coll.item(j).className.toUpperCase()!="lower")
改为
if(coll[j].className.toUpperCase()!="lower")<body><script>
document.write(MakeTableTree(5));
function MakeTableTree(deep)
{
deep--;
var html="<table border=1 style=border-collapse:collapse>";
for(var i=0;i<2;i++)
{
html+="<tr>";
for(var j=0;j<2;j++)
{
html+="<td>"+deep;
if(deep>0)
html+=MakeTableTree(deep);
html+="</td>";
}
html+="</tr>";
}
html+="</table>";
return html;
}</script></body>
<script>function window.onload()
{
alert("document.all.length:"+document.all.length);var d1=new Date();
var e=new Enumerator(document.all)
for(;!e.atEnd();e.moveNext())
{
if(e.item().className.toUpperCase()!="lower")
continue;
}
var d2=new Date();
var coll=document.all;
var len=coll.length;
for(var j=0;j<len;j++)
{
if(coll[j].className.toUpperCase()!="lower")
continue;
}
var d3=new Date();alert(["Enum:",d2-d1,",","Coll:",d3-d2].join(""))
}</script>
改为
if(coll[j].className.toUpperCase()!="lower")
时间差不多啊
是不是用
coll.item(j)的时候,浏览器把coll作为一个对象,重新定位document中的
element而用coll[j]的时候,浏览器把 coll看为一个简单数组呀。???
我原想
Coll[i]会比Coll.item(i)快的。
但是也想不到会快那么多。
http://www.lostinet.com/temp/enum_dppt.htm如果用coll(j)来访问,速度一样好快。。
难道就是因为
coll.item上慢了??
搂主测试的数据其实是一种假象。应为两者的执行顺序不同,编译器等自己还有初始化和清理垃圾等的工作.如果把两者执行顺序调换一下,估计会得到不同的结果.这也正是其他各位测出数据跟楼主完全不同的原因!!!