for 和foreach性能比较

crystalreport20xx 2005-12-30 11:19:02
一直想知道那个的运行速度比较快。请帮个忙
...全文
4734 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Macosx 2006-01-01
  • 打赏
  • 举报
回复
能用foreach就用foreach
aSalt 2006-01-01
  • 打赏
  • 举报
回复
想起哪个用哪个呗,
我一般在数组中用for
在集合中用foreach
lowtemper 2005-12-31
  • 打赏
  • 举报
回复
感觉foreach代码要少写一写
其他没什么感觉
zengj 2005-12-31
  • 打赏
  • 举报
回复
同意tiaoci(我挑刺,我快乐)的说法.
两都各有处长,要看怎么用...
如果只是拿for与foreach来作循环的话,应该for比较快,
如果涉及到取collection里面的数据的话,感觉用foreach去取会比较快...
个人感觉,一会我试一下...
没有测过,不知道到底结果如果...呵呵
真相重于对错 2005-12-31
  • 打赏
  • 举报
回复
既然要测试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();
jackyshower 2005-12-31
  • 打赏
  • 举报
回复
Foreach的语句执行效率比for高 //Foreach遍历变量 只读!
Ivony 2005-12-31
  • 打赏
  • 举报
回复

to Ivony()

既然你都知道foreach用的是IEnumerator对象来索引,关键看这个对象是怎么索引的。

那怎么不去看看代码?真搞笑,不懂乱说

=============================================================

你才搞笑呢,谁告诉你怎么看接口的实现了?
它是一个接口,不同的容器都有不同的实现,我在这里写一个实现你能看到啊?
tiaoci 2005-12-31
  • 打赏
  • 举报
回复
都TMD瞎扯,说foreach的去循环测测

double [] a = new double[100000];

两者各有优点,要看实际情况的
exboy 2005-12-30
  • 打赏
  • 举报
回复
有很多测试,多测试出 foreach 比 for 的性能要好点
fkphp 2005-12-30
  • 打赏
  • 举报
回复
forearch比for快N倍!!!
Aallonlin 2005-12-30
  • 打赏
  • 举报
回复
(引用)

在很多情况下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的代码,,似乎不太合理,
因为,反编译器也有自己的反编译的机制..
个人看法.
Aallonlin 2005-12-30
  • 打赏
  • 举报
回复
如果要测试,最好用object类型的,不要用value的,
因为有box/unbox的问题.

个人看法.
Aallonlin 2005-12-30
  • 打赏
  • 举报
回复
一般情况下,foreach的效率是比for的高,问什么呢?

比如for(int i=0; i<55; i++)
{
arrayList.Add(array[i]);
}
在这里,运行是要附加做一些事: 判断i是不是超出array数组的index的范围(上下标),超出,则exception
然后才取array[i]

在foreach循环中,,直接就是在一个集合里去数据,,无需判断下标什么的,所一要快一些.
在使用foreach的时候要注意的是:在遍历集合的时候,不能对集合进行真删操作,,否则会exception
shrinerain 2005-12-30
  • 打赏
  • 举报
回复
foreach只是for一个封装而已,内部调用的for
veryhappy 2005-12-30
  • 打赏
  • 举报
回复
肯定相差非常小
sylmoon 2005-12-30
  • 打赏
  • 举报
回复
要看场合吧
真相重于对错 2005-12-30
  • 打赏
  • 举报
回复
for 快
echoxue 2005-12-30
  • 打赏
  • 举报
回复
xuexi
diandian82 2005-12-30
  • 打赏
  • 举报
回复
不知道哪个快了
hydonlee 2005-12-30
  • 打赏
  • 举报
回复
应该是没有什么区别的.
唯一的可能就是foreach在编译器级的优化可能会导致foreah会快一点点...

先占个位子, 今天晚上回家再做详细分析.
加载更多回复(9)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧