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

static void Main(string[] args)
{
#region 三种方式循环执行效率测试 List<int> intList = new List<int>();
for (int i = ; i < ; i++)
{
intList.Add(i);
} #region for循环执行时间测试 Stopwatch sw_1 = new Stopwatch();
string excuteTime_1;
int sum1 = ;
sw_1.Start();
for (int i = ; 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 = ;
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 = ;
//using (IEnumerator<int> enumerator = intList.GetEnumerator())//1060
//{
using (var enumerator = intList.GetEnumerator())//
{
//IEnumerator<int> enumerator = intList.GetEnumerator();//1631
//var enumerator = intList.GetEnumerator();//
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()

强类型的执行效率比弱类型的执行效率低,而且低了不少。有哪位大侠知道其中缘故,还请不吝赐教,先谢过。

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

  1. 2019.03.26 读书笔记 关于for与foreach

    for 是索引器,foreach是迭代器 foreach在movenext()中增加了对集合版本(一个整数,每次对集合修改都+1)的验证,另外反编译后的效果是使用了using(是try finally ...

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

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  3. Android复习资料

    转载:http://blog.csdn.net/huachao1001/article/details/53156582 在10月份开始就没有再参与校招了,面试过程真的很累,有时现场等面试一等就是几个 ...

  4. C# IEnumerable,Lambda表达式和 Parallel并行编程的用法

    以前一直主要做C++和C方面的项目,对C#不太了解熟悉,但听说不难,也就一直没有在意学习C#方面的知识.今天有个C#项目,需要做些应用的扩展,同时修改一些bug.但看了C#代码,顿时觉得有些不适应了. ...

  5. php中一些提高性能的技巧

    php中一些提高性能的技巧 tags:php性能 提高性能 php中的@ php的静态 引言:php作为一种脚本语言,本身的性能上肯定是不如c++或者java的.拥有简单易学的特性的同时,性能提升的空 ...

  6. .Net 笔记

    1.介绍 .net一般指.Net Framework框架.一种平台,一种技术. C#是一种编程语言,可以开发基于.net平台的应用. .Net Framework是框架是.Net平台不可缺少的一部分, ...

  7. foreach与正常for循环效率对比

    foreach foreach编译成字节码之后,使用的是迭代器实现的. foreach特点: 无须获取容器大小 需要创建额外的迭代器变量 遍历期间得到的是对象,没有索引位置信息,因此不能进行赋值操作. ...

  8. foreach 和 for 循环的区别

    foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in Ge ...

  9. for循环与foreach的区别

    for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...

随机推荐

  1. mysql-error --(ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out)

    报错信息: ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out 解决办法: # 查看限制情况 [r ...

  2. CentOs7下systemd管理知识要点

    centOs7的一个巨大的变动就是用systemd取代了原来的System V init.systemd是一个完整的软件包,安装完成后有很多物理文件组成,大致分布为,配置文件位于/etc/system ...

  3. Javascript进阶篇——浏览器对象—Location、Navigator、userAgent、screen对象

    Location对象location用于获取或设置窗体的URL,并且可以用于解析URL.语法: location.[属性|方法] location对象属性图示: location 对象属性: loca ...

  4. Android 开源框架

    不推荐使用UltimateAndroid.KJFrameForAndroid.ThinkAndroid.Afinal.xUtil等这种集成网络请求.图片加载.数据库ORM.视图依赖注入.UI框架等的集 ...

  5. html链接

    1. <a href="/index.html">本文本</a> 是一个指向本网站中的一个页面的链接.</p><p><a hr ...

  6. UILable文本常见属性说明

    1.text:设置标签显示文本. 2.attributedText:设置标签属性文本. NSString *text = @"first"; NSMutableAttributed ...

  7. C#实现在线更新系统

    先来看一下程序完成后长什么样. 这个是程序的组成部分. 主要功能是在InitializationUpdate这个类中完成的,From1主要起到调用的作用,所以重心还是在InitializationUp ...

  8. Lucene学习总结之五:Lucene段合并(merge)过程分析

    一.段合并过程总论 IndexWriter中与段合并有关的成员变量有: HashSet<SegmentInfo> mergingSegments = new HashSet<Segm ...

  9. py函数递归

    1.从前有座山,山中有座庙,庙里有一个老和尚在讲故事... 2.递归:程序调用自身. 3.形式:在函数定义有直接或间接调用自身. 例如:阶乘: n!= 1 x 2 x 3 x ... x n; 从后身 ...

  10. 磁盘管理二-LVM相关内容

    1.基本概念 LVM:logical volume manager 逻辑卷管理器 LVM构成:物理卷PV,卷组VG(PE物理区域,最小存储单元),逻辑卷LV(LE逻辑区域,最小存储单元) 三者如下图所 ...