今天没事对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. py练习

    功能类似pop def myPop():    l=[]    a=raw_input('a:')    for i in a:        l.append(i)    l.pop()    pr ...

  2. 2014 BDTC 參会有感

    中国大数据技术大会(Big Data Technology Conference,BDTC)是眼下国内最具影响.规模最大的大数据领域的技术盛会. 大会的前身是Hadoop中国云计算大会(Hadoop ...

  3. EffectiveC#8--确保0对于值类型数据是有效的(初始化问题)

    1.决不要创建一个不包括0在内的枚举类型 2.举例如下: public enum Planet { Mercury = 1, Venus = 2, Earth = 3, Mars = 4, Jupit ...

  4. Code Complete阅读笔记(二)

    2015-03-06   328   Unusual Data Types    ——You can carry this technique to extremes,putting all the ...

  5. js 时间YYYY-MM-DD转换为YYYY/MM/DD 自定义函数格式

    <script type="text/javascript">         window.onload = function () {             va ...

  6. ios 面试题 0

    1.__block和__weak修饰符的区别:  1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型.  2.__weak只能在ARC模式下使用,也只能修饰 ...

  7. iOS系统相册的有关操作

    iOS中,我们选择相册中的资源和调用摄像头可以使用 :UIImagePickerController类来完成,不使用UI我们可以通过:ALAssetsLibrary类来使用相册资源. 一. ALAss ...

  8. 某Java游戏服务器用到的知识

    Runtime.getRuntime().addShutdownHook(shutdownHook); shutdownHook()函数可以在jvm关闭的时候进行内存清理.对象销毁等操作 http:/ ...

  9. html简单定位

    (1) 两个块水平排列 将两个块都设为浮动即可.注意不能将两个块的position属性设为absolute(绝对定位) #div1{ background-color: red; float:left ...

  10. 利用raspberry pi搭建typecho笔记(三) typecho nginx sqlite FAQ

    前言 这是一个汇总文,用来总结我在整个配置过程中遇到的各种问题.因为我在解决这些问题的过程中发现,typecho被部署在这种需要完全自己配置的平台上的情况是比较少的,相关的资料也比较少,所以我的解决过 ...