不过说回来。
访问一个元素所用时间是0.1ms和0.2ms而已
关键还是靠循环里的操作所话的时间。。

解决方案 »

  1.   

    Enum:440,Coll:311
    Enum:421,Coll:250
    Enum:331,Coll:190
      

  2.   

    机器问题?
    Enum:341,Coll:290
      

  3.   

    应该是跟机器性能有关,我这里前者时间是后者的几乎1.5倍,可是偶的机器也不过是PIII 733
      

  4.   

    看这个撒:
    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(""))
      

  5.   

    还有哦
    你们要拿个很多HTML元素的页面来测试哦。。
    而且要在window.onload后才测试。
    不然document.all.length你们能保证多少呢?
      

  6.   

    迷失,你刚才发的又测试了一下:enum:491,coll:230
      

  7.   

    我发个比较好的测试页吧。。:
    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>
      

  8.   

    我就是直接在这个贴子上执行的你的是:
    enum:3136,coll:10905
    而我的是enum:310,coll:356
    To Lostinet:你用这个贴子的方法
    http://expert.csdn.net/Expert/topic/1120/1120460.xml?temp=.8186304直接在这个贴子上执行看看。
      

  9.   

    这个是
    document.all.tags("TD")
    http://www.lostinet.com/temp/enum_td.htm和上面的结果也差好远。。
      

  10.   

    测试环境
    ie6+server 2000
      

  11.   

    打错了吧??
    Enum的才174???
      

  12.   

    http://www.lostinet.com/temp/enum_many.htm天啊。。
    当数量增加到一定程度,,差别太大了document.all.length:2734
    我只循环一次,时间是
    Enum:120,Coll:829270倍啊~~~
      

  13.   

    http://www.lostinet.com/temp/enum_prompt.htm
    6层Table的时候很极限了。(Enum:4xx,Coll:123xxx)
    包括所有的.className.toUpperCase()!="lower"
    Enum的时间还是极短.
      

  14.   

    不错,前面的要快2倍。win2000专业版,IE6.0.2800.
      

  15.   

    现在来解析一下为什么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来提高速度。
      

  16.   

    下面是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删除的
      

  17.   

    因为用法不同,将
    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>
      

  18.   

    if(coll.item(j).className.toUpperCase()!="lower")
    改为
    if(coll[j].className.toUpperCase()!="lower")
    时间差不多啊
    是不是用
    coll.item(j)的时候,浏览器把coll作为一个对象,重新定位document中的
    element而用coll[j]的时候,浏览器把 coll看为一个简单数组呀。???
      

  19.   

    恩。。这个是一个大的发现。
    我原想
    Coll[i]会比Coll.item(i)快的。
    但是也想不到会快那么多。
      

  20.   

    我去找找IE5.0+JScript5.0的机子。。试试。。
      

  21.   

    http://www.lostinet.com/temp/enum_ppt.htm
    http://www.lostinet.com/temp/enum_dppt.htm如果用coll(j)来访问,速度一样好快。。
    难道就是因为
    coll.item上慢了??
      

  22.   

    事实上Enumerator和Collection来遍历的话,两者的数度应该是差不多,要说快的话应该是后者比前者快。因为Enumerator只是个枚举器,它的内部实现应该还是依赖于集合或者数组的遍历。
    搂主测试的数据其实是一种假象。应为两者的执行顺序不同,编译器等自己还有初始化和清理垃圾等的工作.如果把两者执行顺序调换一下,估计会得到不同的结果.这也正是其他各位测出数据跟楼主完全不同的原因!!!