5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

for 和foreach性能比较

楼主crystalreport20xx(自学者)2005-12-30 11:19:02 在 .NET技术 / C# 提问

一直想知道那个的运行速度比较快。请帮个忙 问题点数:20、回复次数:29Top

1 楼hdt(倦怠)回复于 2005-12-30 11:21:32 得分 1

for   快  
  Top

2 楼sylmoon(专注Oracle)回复于 2005-12-30 11:44:30 得分 1

要看场合吧Top

3 楼veryhappy(wx.net)回复于 2005-12-30 11:47:47 得分 1

肯定相差非常小Top

4 楼shrinerain(圣影雨)回复于 2005-12-30 12:15:35 得分 1

foreach只是for一个封装而已,内部调用的forTop

5 楼Aallonlin(风之力)回复于 2005-12-30 12:26:13 得分 1

一般情况下,foreach的效率是比for的高,问什么呢?  
   
  比如for(int   i=0;   i<55;   i++)  
  {  
          arrayList.Add(array[i]);  
  }  
  在这里,运行是要附加做一些事:   判断i是不是超出array数组的index的范围(上下标),超出,则exception  
  然后才取array[i]  
   
  在foreach循环中,,直接就是在一个集合里去数据,,无需判断下标什么的,所一要快一些.  
  在使用foreach的时候要注意的是:在遍历集合的时候,不能对集合进行真删操作,,否则会exceptionTop

6 楼Aallonlin(风之力)回复于 2005-12-30 12:32:45 得分 1

如果要测试,最好用object类型的,不要用value的,  
  因为有box/unbox的问题.  
   
  个人看法.Top

7 楼Aallonlin(风之力)回复于 2005-12-30 12:38:46 得分 1

(引用)  
   
  在很多情况下for和foreach具有同样的功能,选择for还是foreach很多人可能都是看自己的喜好,本测试试图通过来真是测试数据来比较他们的执行效率。希望能给大家对他们的时候带来一些帮助。  
   
  测试环境:      
          硬件环境:       PIII800   +   CPU456  
          软件环境:       VisualStudio.Net     +   C#  
   
  测试用例:  
          利用结果集来存放记录,初始化对结果集添加记录  
          分别对记录数为10000,100000,1000000条记录的时候进行采样分析  
   
          关键测试对比代码如下,功能完全一样:  
          //foreach开始时间  
        datetime3   =   System.DateTime.Now.TimeOfDay.ToString();  
        foreach(DataRow   row   in   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows)  
    buffer   =   row[RelationData.PK_TABLE_NAME].ToString();  
        datetime4   =   System.DateTime.Now.TimeOfDay.ToString();  
   
        //for开始时间  
        datetime5   =   System.DateTime.Now.TimeOfDay.ToString();  
        for(int   j=0;j<1000000;j++)  
                    buffer   =   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows[j][RelationData.PK_TABLE_NAME].ToString();  
        datetime6   =   System.DateTime.Now.TimeOfDay.ToString();  
     
  测试结果:  
        10000条记录时:  
                    foreach读取时间:16:29:34.2577584    
                    foreach结束时间:16:29:34.2677728    
                    for读取开始时间:16:29:34.2677728    
                    for读取结束时间:16:29:34.2878016  
        100000条记录时:  
                    foreach读取时间:16:31:10.1055808    
                    foreach结束时间:16:31:10.1957104    
                    for读取开始时间:16:31:10.1957104    
                    for读取结束时间:16:31:10.4460704  
        1000000条记录时:  
                    foreach读取时间:16:33:12.6217504    
                    foreach结束时间:16:33:13.6332048    
                    for读取开始时间:16:33:13.6332048    
                    for读取结束时间:16:33:18.7906208  
   
  结果分析:  
        1)对于10000条记录可以看出  
                    foreach用了   0.0100144      
                    for循环用了0.0300432    
                    foreach所花的时间正好是for循环的   1/3    
        2)对于100000条记录可以看出  
                    foreach用了0.0901296        
                    for循环用了0.2503600  
                    foreach所花的时间是for循环的   36%  
        3)对于1000000条记录结果可以看出  
                    foreach用了1.0114544        
                    for循环用了4.1574160  
                    foreach所花的时间是for循环的   25%  
   
          通过对这些测试结果的分析,可以看出相对于原来的for语句foreach具有  
  更好的执行效率,foreach的平均花费时间只有for30%。通过测试结果在for和foreach都可以使用的情况下,我们推荐使用效率更高的foreach.在测试同时  
  我们附加的发现,用for写入数据时间大约是读取数据时间的10倍左右.:P      
   
   
  作者/来源未知,,应该是csdn的吧.  
   
   
   
  foreach只是for一个封装而已,内部调用的for  
  并不一定是这样的吧??从哪看出来呢??  
  如果通过反编译来看foreach的代码,,似乎不太合理,  
  因为,反编译器也有自己的反编译的机制..  
  个人看法.Top

8 楼fkphp(桔子)回复于 2005-12-30 12:41:11 得分 1

forearch比for快N倍!!!Top

9 楼exboy(kuku)回复于 2005-12-30 12:44:28 得分 1

有很多测试,多测试出   foreach   比   for   的性能要好点Top

10 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-12-30 13:02:18 得分 1

foreach用的是IEnumerator对象来索引,关键看这个对象是怎么索引的。  
   
  foreach是for的封装纯属无稽之谈……Top

11 楼wangxibing(炳如日星)回复于 2005-12-30 13:03:36 得分 1

分析一下产生的汇编代码是不是可以得出结果呢?Top

12 楼yishan116(哈哈)回复于 2005-12-30 13:09:41 得分 1

听说是foreach快,但到底为什么   我也不知道Top

13 楼hyj_828(水梦)回复于 2005-12-30 13:13:45 得分 1

等待楼下高手来解答.Top

14 楼jamesfay(狒狒)回复于 2005-12-30 13:32:52 得分 1

foreach需要调用IEnumerator,IEnumerable接口,关键看这个接口的代码如何,如果我瞎写一个也能让他很慢很慢  
   
  那个测试for慢的原因:  
  buffer   =   relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows[j][RelationData.PK_TABLE_NAME].ToString();  
  每次都从relationData拿起,这样是不公平的,因为foreach每次都从DataRows里面拿relationData.Tables[RelationData.RELATIONINFO_TABLE].Rows  
  Top

15 楼Aallonlin(风之力)回复于 2005-12-30 15:03:28 得分 1

foreach需要调用IEnumerator,IEnumerable接口,关键看这个接口的代码如何,如果我瞎写一个也能让他很慢很慢..  
  谁会愿意瞎写呢??如果你故意的,,那就不用比较了,没意义    
   
  刚才没注意看上面的代码,感觉是又点问题,sorry.  
  我自己写了一个,测了一下,感觉效率差不多,郁闷.  
  大家也可以测一下,或者直接拿下面的代码去测(放在button_clicked下就可以了).看看效果.  
  等下有时间看下IL,有收获了再分享...    
   
  int   rowNum   =   100000;  
   
  System.Data.DataTable   dt   =   new   System.Data.DataTable();  
  System.Data.DataColumn   col   =   new   System.Data.DataColumn("id",typeof(long));  
  dt.Columns.Add(col);  
   
  for(int   i=0;   i<rowNum;   i++)  
  {    
  DataRow   row   =   dt.NewRow();  
  row["id"]=i;  
  dt.Rows.Add(row);  
  }  
   
  object   o;  
   
  DateTime   foreachDateTimeStart   =   DateTime.Now;  
  foreach(DataRow   row   in   dt.Rows)  
  {  
  o   =   row;  
  }  
  DateTime   foreachDateTimeEnd   =   DateTime.Now;  
  TimeSpan   foreachTS   =   foreachDateTimeEnd.Subtract(foreachDateTimeStart);  
   
  int   sum=dt.Rows.Count;  
  DateTime   forDateTimeStart   =   DateTime.Now;  
  for(int   i=0;   i   <   sum;   i++)  
  {  
  o=dt.Rows[i];  
  }  
  DateTime   forDateTimeEnd   =   DateTime.Now;  
  TimeSpan   forTS   =   forDateTimeEnd.Subtract(forDateTimeStart);  
   
  MessageBox.Show("Foreach:"   +   foreachTS.ToString()   +      
                          "\r\nFrom:"   +     foreachDateTimeStart.TimeOfDay.ToString()+  
  "\r\nTo:"   +   foreachDateTimeEnd.TimeOfDay.ToString()   +  
  "\r\n\rFor:"   +   forTS.ToString()   +  
  "\r\nFrom"   +   forDateTimeStart.TimeOfDay.ToString()+  
                          "\r\nTo"   +   forDateTimeEnd.TimeOfDay.ToString()  
  );Top

16 楼Aallonlin(风之力)回复于 2005-12-30 15:05:52 得分 1

因为时间的精度不好把握,而且操作系统也在运行其他进程,  
  对时间都会有影响的,  
  所以要多比较几次...Top

17 楼shrinerain(圣影雨)回复于 2005-12-30 16:04:09 得分 1

to     Ivony()  
   
  既然你都知道foreach用的是IEnumerator对象来索引,关键看这个对象是怎么索引的。  
   
  那怎么不去看看代码?真搞笑,不懂乱说Top

18 楼c11_11_11(走猪观花)回复于 2005-12-30 16:13:36 得分 1

一般情况下,foreach的效率是比for的高  
   
  1,因为foreach是单向的  
  Top

19 楼hydonlee(青山情)回复于 2005-12-30 16:52:58 得分 1

应该是没有什么区别的.  
  唯一的可能就是foreach在编译器级的优化可能会导致foreah会快一点点...  
   
  先占个位子,   今天晚上回家再做详细分析.Top

20 楼diandian82(点点(nothing))回复于 2005-12-30 17:24:52 得分 1

不知道哪个快了  
  Top

21 楼echoxue(咱当过兵的人)回复于 2005-12-30 17:25:28 得分 0

xuexiTop

22 楼jackyshower(伟)回复于 2005-12-31 08:57:09 得分 0

Foreach的语句执行效率比for高   //Foreach遍历变量   只读!Top

23 楼hdt(倦怠)回复于 2005-12-31 09:43:58 得分 0

既然要测试for与foreach的性能,那循环之间的运行时间必须要求一致,否则算什么比较,诸如楼上诸位  
  string   strCount   =   this.textBox1.Text;  
  int   nCount   =   int.Parse(   strCount   );  
  string[]   arrStr   =   new   string[nCount];  
  int   n=1000000;  
  DateTime   dtforstart   =   DateTime.Now;  
  for(   int   i=0   ;   i<nCount   ;   i++   )  
  {  
  while(   n   >   0   )  
  {  
  n--;  
  }  
  }  
  DateTime   dtforend   =   DateTime.Now;  
  System.TimeSpan   tsfor   =   dtforend   -   dtforstart;  
  this.label1.Text   =   "for:"+tsfor.Milliseconds.ToString();  
  n=1000000;  
  DateTime   dtforeachstart   =   DateTime.Now;  
   
  foreach(   string   str   in   arrStr   )  
  {  
  while(   n   >   0   )  
  {  
  n--;  
  }  
  }  
  DateTime   dtforeachend   =   DateTime.Now;  
  System.TimeSpan   tsforeach   =   dtforeachend   -   dtforeachstart;  
  this.label2.Text   =   "foreach:"+tsforeach.Milliseconds.ToString();  
  Top

24 楼tiaoci(我挑刺,我快乐)回复于 2005-12-31 19:34:47 得分 0

都TMD瞎扯,说foreach的去循环测测  
   
  double   []   a   =   new   double[100000];  
   
  两者各有优点,要看实际情况的  
  Top

25 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-12-31 20:19:55 得分 0

 
  to     Ivony()  
   
  既然你都知道foreach用的是IEnumerator对象来索引,关键看这个对象是怎么索引的。  
   
  那怎么不去看看代码?真搞笑,不懂乱说  
   
  =============================================================  
   
  你才搞笑呢,谁告诉你怎么看接口的实现了?  
  它是一个接口,不同的容器都有不同的实现,我在这里写一个实现你能看到啊?Top

26 楼zengj(平民)回复于 2005-12-31 22:09:56 得分 0

同意tiaoci(我挑刺,我快乐)的说法.  
  两都各有处长,要看怎么用...  
  如果只是拿for与foreach来作循环的话,应该for比较快,  
  如果涉及到取collection里面的数据的话,感觉用foreach去取会比较快...  
  个人感觉,一会我试一下...  
  没有测过,不知道到底结果如果...呵呵  
  Top

27 楼lowtemper(小镇姑娘她爹)回复于 2005-12-31 23:07:12 得分 0

感觉foreach代码要少写一写  
  其他没什么感觉Top

28 楼yuanarea(Sail before)回复于 2006-01-01 13:41:46 得分 0

想起哪个用哪个呗,  
  我一般在数组中用for  
  在集合中用foreachTop

29 楼Macosx(结贴)回复于 2006-01-01 15:16:28 得分 0

能用foreach就用foreachTop

相关问题

  • 关于setObject和setXXX性能的比较
  • 请教resin和tomcat的性能比较
  • 请教,SQL Server和Oracle的性能比较
  • 求.net sqlclient 和 oldeb data provider的性能比较文章
  • WebService数据流压缩和Remoting性能比较
  • vf/access的性能比较
  • 谁很详细地比较过servlet和isapi的性能和可维护性吗?
  • 有谁比较过自己封装的buffer类和pipe的性能?
  • C#和Java的性能比较:兼谈一种做学问的态度
  • 谁有使用fopen和createfile这两种方式的性能比较?

关键词

  • foreach
  • datetime
  • 感觉
  • 实现
  • 知道

得分解答快速导航

  • 帖主:crystalreport20xx
  • hdt
  • sylmoon
  • veryhappy
  • shrinerain
  • Aallonlin
  • Aallonlin
  • Aallonlin
  • fkphp
  • exboy
  • Ivony
  • wangxibing
  • yishan116
  • hyj_828
  • jamesfay
  • Aallonlin
  • Aallonlin
  • shrinerain
  • c11_11_11
  • hydonlee
  • diandian82

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问