测一下不就知道了 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
你有试过么,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)); } 这是可以改的。也就是说我们遍历实体类对象列表时,可以修改对象中的属性信息的。
搞笑!!我再说一次,在 foreach 循环里面的迭代变量是不可以修改的!!!!是迭代变量本身!不是跌代变量内部的属性,晕死。什么理解力。你在做这个测试的时候难道就没有试过下面的这个代码吗?你能编译通过吗?int[] a = new int[] { 1, 2, 3 }; foreach (int i in a) { i = 5; }
要遍历的数据集合中数据的复杂度越高,效率相对于for循环就越高,也就是说,使用foreach遍历List<SomeClass>比用for速度更快,但是这也是相对于大数据量而言,一般情况下没有意义。但是foreach循环时不能修改迭代变量
个人觉得理论上foreach更高
至于哪个更快看代码吧。
顶一下,个人还没发现这个呢,我一般用FOR,很少用foreach,看来以后得用用 了
用的时候看个人所需
1:用户需求(如果要求修改集合内的属性值只能用FOR了,如果只是为了找到对应一批元素,都可以)
2:速度(遍历小集合数据时速度可以忽略,遍历大批量数据尤其是泛型数据时,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会越来越多.
for和foreach的性能差别很小,一般可以忽略,不用钻牛角尖,根据实际需要和习惯就是了,比如foreach遍历可以直接使用当前对象而不用使用索引。要研究它们的区别最好看一下IL,我感觉foreach应该是在底层调用for的,因为for是几乎任何编程语言都有的表达式,而foreach相对来说是派生出来的,抽象层级更高。
取数for不会比foreach差。这句话不正确。以:下为例:
for (int i= 0; i<count; i++)
{
list[i];
}
来说,由于list[i]这种链表取数,本来就要不断的moveNext()。所以for中了取数效率肯定不会高于
foreach。
综合来说,
1、就取数来说,必须是时间复杂度为0时才能与foreach相当。如果像队列(列表)那么for会差会远。
2、所以在目前用List等多,而用数组少的话,foreach是有优势的。
我没研究过它们的底层实现,但是我认为for是编程语言最基本的表达式,而foreach是更抽象一点的,更“高级”一点,当然这里的“高级”并不是就意味着越快,而是抽象层级更高,也就越依赖于底层,那么性能就可能不如底层,foreach很可能是在底层调用for,除非微软是重新实现foreach。
不过,不管怎样,它们的性能差别微乎其微,最重要的是看实际需要
{
// ......
}这句话无论如何都是 foreach 望尘莫及的。
有一个非常关键的是 foreach 的安全性:foreach 中的元素都是 readonly 的,不允许你修改的。
要遍历的数据集合中数据的复杂度越高,效率相对于for循环就越高,也就是说,使用foreach遍历List<SomeClass>比用for速度更快,但是这也是相对于大数据量而言,一般情况下没有意义。但是foreach循环时不能修改迭代变量
for(int i = 0; i <a.count; i++)
.count 需要计算
[i] 需要指向!
{
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
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));
}
这是可以改的。也就是说我们遍历实体类对象列表时,可以修改对象中的属性信息的。
掉了个sw.Stop();
所以写了个循环来测试,在我机子上后面几次的输出趋于稳定,相差基本都在+-5ms
不能修改的是这个枚举的对象
比如:
foreach(int i in arr){
arr.Add(123);// 报错
}
而迭代器一般是current为空时退出。总的来说for应该占优。
2:取数for不会比foreach差。但这取决与写代码的人。因为for本身不取数。
在本例中是List<int>,那么取取应该是一样。但如果类似int[]数组,那么取数就比迭代器有优秀。
3、这些都是理念上的分析,实际上应该差别不大,但froeach设计较灵活、功能更强大,使得书写的代码简单、优美,同时也可以会少定义几个临时变量。所以个人感觉用foreach会越来越多.
搞笑!!我再说一次,在 foreach 循环里面的迭代变量是不可以修改的!!!!是迭代变量本身!不是跌代变量内部的属性,晕死。什么理解力。你在做这个测试的时候难道就没有试过下面的这个代码吗?你能编译通过吗?int[] a = new int[] { 1, 2, 3 };
foreach (int i in a)
{
i = 5;
}