public static void Main(string[] args)
        {
            System.Collections.ArrayList arrayList = new System.Collections.ArrayList();
            int length = 16777216;
            for (int i = 0; i < length; ++i)
            {
                arrayList.Add(i);
            }            System.Console.WriteLine("Thie size of arrayList is: {0}", arrayList.Capacity);
            DateTime start = new DateTime();            start = DateTime.Now;
            foreach (int i in arrayList)
            {}
            DateTime end = DateTime.Now;
            TimeSpan ts = end - start;
            System.Console.WriteLine("foreach method used [{0}] ms to traversal the arrayList!", ts.TotalMilliseconds);            start = DateTime.Now;
            for (int i = 0; i < arrayList.Capacity; ++i)
            {}
            end = DateTime.Now;
            ts = end - start;
            System.Console.WriteLine("for method used [{0}] ms to traversal the arrayList!", ts.TotalMilliseconds);
            System.Console.Read();            /*运行结果如下: 
               * Thie size of arrayList is: 16777216
             * foreach method used [343.75] ms to traversal the arrayList!
             * for method used [109.375] ms to traversal the arrayList!
             */
        }

解决方案 »

  1.   

    foreach 时要把拆箱 int 类型,所以慢,可以试试向 arrayList 里添加引用类型,仍然会有差距,但不会这么大。 for (int i = 0; i < length; ++i)
     {
         arrayList.Add(new object());
     }
      

  2.   

    那看来能用for的地方还是少用foreach了
      

  3.   

    如果是arraylist可以用list<T>取代,性能会好很多。
    另外你的for并没有实际赋予对象,相当于for(int i=0;i<j;i++),而foreach则是已经赋予对象了的,
    是有差别的
      

  4.   

    楼主的理解是错误的,foreach的效率肯定是比for快的,你的代码中之所以慢,完全是由于遍历中的类型转换造成的,相当于foreach的这段代码每次读数据时实际上都多做了一个拆箱的操作,这一点上和for根本就不站在同一起跑线上了,如果你用list<int>来代替arrylist,你就会发现真正的情况和你想的不一样了
      

  5.   

    你用错了。foreach 效率最高。
    List<int> list = new List<int>();
    //list 赋值
     foreach (int i in list )
    {}
      

  6.   

    对ArrayList操作,foreach比for慢。
      

  7.   

    在你上面例子中FOREACH多了拆箱操作,相当于如下代码:
    for (int i = 0; i < arrayList.Capacity; ++i)
    {
      int v = arrayList[i];
    }
    你试试,应该差距不大
      

  8.   

    上面我试过了,还是for快好多。
    for (int i = 0; i  < arrayList.Count; ++i) 

      int v = (int)arrayList[i]; 
    } 莫非是因为Foreach采用的是ienumerator接口,多了函数的调用?所以慢了?关注
      

  9.   

    我测试了List<int>,结果仍然是for快,我感觉是foreach多了函数的调用
      

  10.   

    array在loop的时候不用反复获取array的总数,.net编译器优化了。 arrayList的总数为较小的时候,应该是foreach快点,前提是能测试出来
    foreach用的ienumerator慢点。
      

  11.   

     int length = 80011;
    我测试的时候就是foreach快点了。
      

  12.   

    感兴趣,测试了一下,还是FOREACH慢一点哦,它中间的经过的过程肯定要复杂一点
      

  13.   

    List<int> arrayList = new List<int>();
                
    foreach (int i in arrayList)
    {
    }for (int i = 0; i < arrayList.Capacity; ++i)
    {
        int val = arrayList[i];
    }上面两个操作基本上完全等价的,执行完成的时间基本上差不多,在200ms左右。事实上foreach并没有改变多少效率问题,当然应当会慢一点,因为遍历的访问的方式,但不至于离谱到1/3于for。
      

  14.   

    但是Microsoft本身的說法是,foreach比for的效率高的哦。我也要仔細測試一下了。
      

  15.   

    我現在是使用dotnetfx2.0平台的datatable的datarow來做測試了,針對五萬行五列記錄進行賦值存取,foreach隻要0.23秒,而for則要0.41秒。樓主使用ArrayList來測試,有沒有試過datatable、List<T>或者其它呢?並且,到了dotnet2.0後,ArrayList已經幾乎被List<T>取代了。
      

  16.   

    问题比较严重....MS自己说是foreach快...
      

  17.   

    1 LZ的代码里第二个for根本没有访问arrayList 相当于
    for(int i=0;i<16777216;i++);
    而foreach却访问了arrayList 至少取得了他每一个变量 如果在循环里写上代码 两者就相差无几了
    foreach (int i in arrayList)
                {
                    j = i;
                }
    for (int i = 0; i < arrayList.Count; ++i)
                {
                    j = arrayList[i];
                }2 而且使用用for的话使用要索引器访问迭代变量 效率损失很大
    比如使用datatable的话在for中得用Dt.Rows[i]来引用 这样的效率损失是非常大的 我试了用datatable的话for比foreach要多用掉很多很多时间
    所以在不修改迭代变量的情况下还是用foreach效率好些
      

  18.   

    微软说的是,数据量不大时用foreach,反之用for
      

  19.   

    for 中有arralylist.add()方法,而foreach中没有,那这个方法执行也是需要时间的吧,如果是那for应该更短。
    我试了一个,看不出来,受页面加载时间的影响。
      

  20.   

    在我的使用过程中,发现还是for语句效率比较高一点,我也使用的list<T>。在两种方法使用也没有涉及到拆箱和装箱,通过使用StopWatch类的检查时间来看,for的语句的效率还是要高多了。
      

  21.   


      int count=0;
      string name="";
      foreach (DataRow dr in dt.Rows)
      {
        if(name==dr["Name"].ToString())
        {
          count++;
        } 
        else
        {
           count=1;
        }
      }
    foreach 在迭代取值比for快,在100W条数据foeach为1.34375s,for为2.23544s