今天没事对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. 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码

    [实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...

  2. [置顶] Application,Session,Cookie之Application对象

    概述 Application为全局作用域,且只有一个Application对象,它可以存储和访问任意页面的变量(数据存储类型都是Object,也就是任意类型),同时也被多页面使用(也为引用). App ...

  3. Git 笔记一 Git简介

    git 笔记一 什么是版本控制 所谓版本控制就是记录对文件的修改记录,这样以后就能回退到需要的 版本.比如你对一段代码进行了几次修改,有几次修改不想要了,如果 使用了版本控制,就可以回退到未做这些修改 ...

  4. 数据结构算法及应用——二叉树

    一.二叉树性质 特性1 包含n (n> 0 )个元素的二叉树边数为n-1 特性2 二叉树的高度(height)或深度(depth)是指该二叉树的层数(有几层元素,而不是有层的元素间隔) 特性3 ...

  5. jquery动态删除、复制、包裹DOM节点

    1.remove()方法 移除满足条件的元素 <html> <head> <meta http-equiv="Content-Type" conten ...

  6. poj 3158kickdown

    我是来吐槽poj的!!! 第一次做poj,被题目中的输入输出格式打败了 ,醉了醉了 Description A research laboratory of a world-leading autom ...

  7. poj3581Sequence(后缀数组)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Sequence Time Limit: 5000MS   Memory Limi ...

  8. shell中的环境变量

    局部(local)环境变量 定义局部环境变量的方式如下: variableName=value 需要注意的是variableName前面没有$符号,并且=两边没有空格. 局部环境变量只能在当前shel ...

  9. 利用glibc中锁结构的信息解决死锁问题

       首先非常感谢老丁和老李同学的帮助,没有他们这个问题估计又得搞很久.遇见这个问题,真是头疼.不熟悉代码.不熟悉流程,但是领导还是把活给排下来了(实在不解),只能硬着头皮找了. 问题是这样的,cac ...

  10. EF 请求数据是缓存 求大神解释

    // //AliexpressEntities MyaliexpressEntities 为了事物一致性 在别的方法里面传过来的 实质还是 (  AliexpressEntities aliexpre ...