for、foreach和MoveNext循环效率粗比较

今天没事对for循环、foreach循环、MoveNext循环,执行效率进行了对比;粗略测试代码如下:

static void Main(string[] args)
        {
            #region 三种方式循环执行效率测试

            List<int> intList = new List<int>();
            for (int i = 0; i < 100000000; i++)
            {
                intList.Add(i);
            }

            #region for循环执行时间测试

            Stopwatch sw_1 = new Stopwatch();
            string excuteTime_1;
            int sum1 = 0;
            sw_1.Start();
            for (int i = 0; i < intList.Count; i++)
            {
                sum1 += intList[i];
            }
            sw_1.Stop();
            excuteTime_1 = sw_1.ElapsedMilliseconds.ToString();
            #endregion

            #region foreach循环执行时间测试

            Stopwatch sw_2 = new Stopwatch();
            int sum2 = 0;
            string excuteTime_2;
            sw_2.Start();
            foreach (var item in intList)
            {
                sum2 += item;
            }
            sw_2.Stop();
            excuteTime_2 = sw_2.ElapsedMilliseconds.ToString();
            #endregion

            #region enumerator.MoveNext循环执行时间

            Stopwatch sw_3 = new Stopwatch();
            string excuteTime_3;
            int sum3 = 0;
            //using (IEnumerator<int> enumerator = intList.GetEnumerator())//1060
            //{
            using (var enumerator = intList.GetEnumerator())//630
            {
                //IEnumerator<int> enumerator = intList.GetEnumerator();//1631
                //var enumerator = intList.GetEnumerator();//976
                sw_3.Start();
                while (enumerator.MoveNext())
                {
                    sum3 += enumerator.Current;
                }
                sw_3.Stop();
                excuteTime_3 = sw_3.ElapsedMilliseconds.ToString();
            }

            #endregion

            Console.WriteLine("for循环执行时间:" + excuteTime_1);
            Console.WriteLine("foreach循环执行时间:" + excuteTime_2);
            Console.WriteLine("movenext循环执行时间:" + excuteTime_3);

            /*
             * 1)、通过以上对for循环、foreach循环和Enumerator.MoveNext()方式循环的测试,显示执行效率由高到低依次为:MoveNext>foreach>for。
             * 2)、上面的结论前提是在获取IEnumerator<T>时,用弱类型var,而不是强类型IEnumrator<int>);
             * 3)、如果变量用强类型,MoveNext的效率显著下降,比foreach低,甚至比for循环效率还低。
             */
            #endregion

            #region Queue队列测试

            QueueClass.QueueFun_1();
            #endregion

            QueueClass queueClass = new QueueClass();
            Console.ReadKey();
        }

最后又一点比较奇怪,

IEnumerator<int> enumerator = intList.GetEnumerator()
var enumerator = intList.GetEnumerator()

强类型的执行效率比弱类型的执行效率低,而且低了不少。有哪位大侠知道其中缘故,还请不吝赐教,先谢过。
时间: 2024-11-08 22:32:46

for、foreach和MoveNext循环效率粗比较的相关文章

你可能不知道的陷阱, IEnumerable接口

IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的for循环写得心烦,foreach就顺畅了很多. 我很喜欢这个接口,但在使用中也遇到不少的疑问,你是不是也有与我一样的困惑: (1) IEnumerable 与  IEnumerator到底有什么区别 (2) 枚举能否越界访问,越界访问是什么后果?为什么在枚举中不能改变集合的值? (3) Linq的具体实现到底是怎样的,比如Skip,它跳过了一些元素,那么这些

Android复习资料

转载:http://blog.csdn.net/huachao1001/article/details/53156582 在10月份开始就没有再参与校招了,面试过程真的很累,有时现场等面试一等就是几个小时.加上毕业论文开题的压力,所以没有继续参加各个公司笔面试了.过去几个月中,复习时也曾经到处搜资料.搜真题.毕竟从小到大考试都是有教科书复习,有老师划重点.现在找工作都没有这些,只有靠自己.所以特别理解准备找工作的小伙伴们空有好好复习的决心,花了很多时间却没有复习多少知识,因为在搜资料过程需要很多

php中for循环与foreach循环效率比较

昨日晚上,在不经意间听到别人说php中for循环效率比foreach高,尽量多用for循环可以提高php效率. 听到这个论调,我当时一愣,for每次循环前都要进行判断,而foreach只需在数组内部移动指针,for的效率会比foreach要高? ------------------- 今天特地写了个简单的脚本做了测试(以下结果皆采用多次测试后的平均值) $max = 100000; $arr = range(0,$max); $t1 = microtime(true); for($i = 0;$

分析for和foreach的差异

最近在写一个CAD的插件程序,但是在执行时总是提示“被调用的对象已与其客户端断开连接”的错误,其初修改了很多次,但始终问题没有解决,其中一段代码是: foreach(IPart p in Application.Parts) { var name = p.Name; if(filenames.Contains(name)) { p.Close(name); } } 以上代码非常简单吧,但是跟踪代码错误提示是在var name = p.Name 处.经过分析,最后将程序稍作修改,便解决了问题.调整

for循环与foreach的区别

foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 期间GetList()方法只执行一次. 1 2 3 4 5 6 7 8 9 10 11 12 13 foreach   (var a in GetList()) {     ... } = var a; IEnumerator  e 

foreach和for循环的区别

1.foreach foreach依赖IEnumerable接口. 第一次var a in GetList()时调用GetEnumerator()返回第一个对象并赋给a,以后每次再执行 var a in GetList() 的时候仅调用MoveNext,直到循环结束.在循环期间GetList()方法只执行一次. 1 foreach (var a in GetList()) 2 { 3 ... 4 } 5 6 //与下面具有相同功能 7 8 var a; 9 IEnumerator e = Get

c# for 和 foreach 的区别

foreach 能够进行foreach的类型结构,都必须实现IEnumerable接口. IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对象.IEnumerator接口,有Current只读属性,MoveNext方法,Reset方法. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直

c# for 和 foreach

1给定长度 不需要计算长度的 for比foreach循环效率高 2 在不确定长度 或者计算长度有性能损耗的时候 用foreach比较方便 2336 循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环.那么我要说的就是,在循环操作中尽量使用foreach语句来实现. 为了来更好地说明为什么要提倡使用foreach,用如下三种不同方式来编写循环语句. int[] nArray = new int[100]; // Use "foreach"

【java8】为java8的foreach正名

首先为自己没有经过严格测试得出的错误结论感到抱歉,原博文,测试完感觉自己发现了一个新bug,后来思前想后觉得不应该是这样的,如果效率差的这么多,jdk的开发人员会不去优化它吗,但是怎么重复测试任然得到一样的结果,非常疑惑. 我觉得应该是测试方法出问题了,可是怎么也想不到原因,后来了解到jmh,深入研究了一番,觉得jmh的测试值得借鉴,jmh在测试的时候都会先经过预热几遍要测试的代码,示例如下: public static void main(String[] args) throws Runne