for 和foreach性能比较
一直想知道那个的运行速度比较快。请帮个忙 问题点数: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



