本人菜鸟大家都发表下自己的观点吧,for循环和foreach在性能上有没有什么区别

解决方案 »

  1.   

    foreach:
    要遍历的数据集合中数据的复杂度越高,效率相对于for循环就越高,也就是说,使用foreach遍历List<SomeClass>比用for速度更快,但是这也是相对于大数据量而言,一般情况下没有意义。但是foreach循环时不能修改迭代变量
      

  2.   

    虽说差不多
    个人觉得理论上foreach更高
      

  3.   

    foreach本质上IEnumerator的调用实现,完了会在finally中IEnumerator的Dispose方法。
    至于哪个更快看代码吧。
      

  4.   


    顶一下,个人还没发现这个呢,我一般用FOR,很少用foreach,看来以后得用用 了
      

  5.   

    foreach是不能修改元素项,从foreach的本质上可以知道,而且索引无法直接达到,
    用的时候看个人所需
      

  6.   

    foreach是for一个封装,内部调用的for 
      

  7.   

    foreach和for看你在什么情况下用,各有所长 
      

  8.   

    CLR 对 foreach 循环进行了优化的,foreach 快。
      

  9.   

    一般情况下是忽略不计
    1:用户需求(如果要求修改集合内的属性值只能用FOR了,如果只是为了找到对应一批元素,都可以)
    2:速度(遍历小集合数据时速度可以忽略,遍历大批量数据尤其是泛型数据时,FOREACH效率更高)
      

  10.   

    差不多,一个好的实现,for在速度上是不会比foreach慢,foreach功能更强。
    foeach是通过"迭代器"来进行循环和取数,类似:
    instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>::get_Current()
    instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>::MoveNext()而for是简单的循环,不负责取数,类似:IL_005f:  ldloc.3
    [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)  //取数
    IL_0073:  blt.s      IL_005f    //循环比较:
    1:简循环来说,for不能再省了,但他多一个取count的过程,类似 for (int i=0; i<count; i++)
    而迭代器一般是current为空时退出。总的来说for应该占优。
    2:取数for不会比foreach差。但这取决与写代码的人。因为for本身不取数。
    在本例中是List<int>,那么取取应该是一样。但如果类似int[]数组,那么取数就比迭代器有优秀。
    3、这些都是理念上的分析,实际上应该差别不大,但froeach设计较灵活、功能更强大,使得书写的代码简单、优美,同时也可以会少定义几个临时变量。所以个人感觉用foreach会越来越多.
      

  11.   

    这种事情最好不要写测试验证,干扰因素太多,而且干扰因素根本无法避免,最好是从理论上,即代码原理上去分析,很多事情是没法用试验测试出来的,就像牛顿第一定律一样,你不可能制造出无限光滑的地面。
    for和foreach的性能差别很小,一般可以忽略,不用钻牛角尖,根据实际需要和习惯就是了,比如foreach遍历可以直接使用当前对象而不用使用索引。要研究它们的区别最好看一下IL,我感觉foreach应该是在底层调用for的,因为for是几乎任何编程语言都有的表达式,而foreach相对来说是派生出来的,抽象层级更高。
      

  12.   

    补充:
    取数for不会比foreach差。这句话不正确。以:下为例:
    for (int i= 0; i<count; i++)
    {
        list[i];
    }
    来说,由于list[i]这种链表取数,本来就要不断的moveNext()。所以for中了取数效率肯定不会高于
    foreach。
    综合来说,
    1、就取数来说,必须是时间复杂度为0时才能与foreach相当。如果像队列(列表)那么for会差会远。
    2、所以在目前用List等多,而用数组少的话,foreach是有优势的。
      

  13.   

    不敢苟同,有证据吗?
    我没研究过它们的底层实现,但是我认为for是编程语言最基本的表达式,而foreach是更抽象一点的,更“高级”一点,当然这里的“高级”并不是就意味着越快,而是抽象层级更高,也就越依赖于底层,那么性能就可能不如底层,foreach很可能是在底层调用for,除非微软是重新实现foreach。
    不过,不管怎样,它们的性能差别微乎其微,最重要的是看实际需要
      

  14.   

    楼主,其实,你不能这么比,循环性能上的差距绝对不是因为你用的是不是 for/foreach 来决定的,如果性能出现问题,一定是 foreach 里面的代码问题。for 和 foreach,如果要比较的话,我觉得应该比较两者的适用场合。for 明显更加的灵活,foreach 则只适合简单循环。举个例子:for (string s = Console.ReadLine(); s != ""; s = Console.ReadLine())
    {
        // ......
    }这句话无论如何都是 foreach 望尘莫及的。
    有一个非常关键的是 foreach 的安全性:foreach 中的元素都是 readonly 的,不允许你修改的。
      

  15.   

    foreach:
    要遍历的数据集合中数据的复杂度越高,效率相对于for循环就越高,也就是说,使用foreach遍历List<SomeClass>比用for速度更快,但是这也是相对于大数据量而言,一般情况下没有意义。但是foreach循环时不能修改迭代变量
      

  16.   

    foreach 适合 对象遍历for适合变量算法遍历单纯外部 性能问题??
    for(int i = 0; i <a.count; i++)
    .count 需要计算
    [i] 需要指向!
      

  17.   

    foreach不允许修改遍历对象的,for可以,如果你非要测试下性能,自己写代码测试下~~~来个几千W数据,然后在那里看表吧
      

  18.   

    测一下不就知道了    class Program
        {
            static void Main(string[] args)
            {            
                Console.WriteLine("Press enter to continue testing!");
                do
                {
                    For_Each.TestEfficiency();
                    Console.WriteLine("-------------------------------------------");
                } while (Console.ReadKey().Key == ConsoleKey.Enter);
            }        static void TestEfficiency()
            {
                const int COUNT = 100000000;            
                Stopwatch sw = new Stopwatch();
                //改集合类型 ToList()
                var list = Enumerable.Range(1, COUNT).ToArray(); 
                int temp = 0;
                sw.Start();
                for (int i = 0; i < COUNT; ++i) temp = 0 - list[i];
                sw.Stop();
                Console.WriteLine("for circulate elapsed time:{0}", sw.ElapsedMilliseconds);
                temp = 0;
                sw.Restart();
                foreach (var i in list) temp = 0 - i;
                Console.WriteLine("foreach circulate elapsed time:{0}", sw.ElapsedMilliseconds);
            }for在前,foreach在后
    当集合类型为int[]时,大概是587 VS 718
    当为List时,大概是780 VS 730
    当把for中的常量改为list.Count时,会慢大概260ms
      

  19.   

    你有试过么,foreach不能修改内容?
        public class T1
        {
            public int x = 2;
        } List<T1> s = new List<T1>();
                T1 t1 = new T1();
                s.Add(t1);            foreach (T1 item in s)
                {
                    item.x = 3;
                    Response.Write(string.Format("<br />{0}", item.x));
                }
    这是可以改的。也就是说我们遍历实体类对象列表时,可以修改对象中的属性信息的。
      

  20.   


    掉了个sw.Stop();
    所以写了个循环来测试,在我机子上后面几次的输出趋于稳定,相差基本都在+-5ms
      

  21.   

    汗,属性当然是可以修改的
    不能修改的是这个枚举的对象
    比如:
    foreach(int i in arr){
    arr.Add(123);// 报错
    }
      

  22.   

    1:简循环来说,for不能再省了,但他多一个取count的过程,类似 for (int i=0; i<count; i++)
    而迭代器一般是current为空时退出。总的来说for应该占优。
    2:取数for不会比foreach差。但这取决与写代码的人。因为for本身不取数。
    在本例中是List<int>,那么取取应该是一样。但如果类似int[]数组,那么取数就比迭代器有优秀。
    3、这些都是理念上的分析,实际上应该差别不大,但froeach设计较灵活、功能更强大,使得书写的代码简单、优美,同时也可以会少定义几个临时变量。所以个人感觉用foreach会越来越多.
      

  23.   

    只知道实现IEnumerable接口,可以使用foreach遍历,而那个接口中的GetEnumerable()返回一个IEnumrator 接口,感觉好绕口,刚学
      

  24.   


    搞笑!!我再说一次,在 foreach 循环里面的迭代变量是不可以修改的!!!!是迭代变量本身!不是跌代变量内部的属性,晕死。什么理解力。你在做这个测试的时候难道就没有试过下面的这个代码吗?你能编译通过吗?int[] a = new int[] { 1, 2, 3 };
    foreach (int i in a)
    {
        i = 5;
    }