实例比较for和foreach的效率C#
在网上看到不少有关 for 和 foreach 效率比较的文章,有的说 for 效率高,有的说 foreach 效率高。我觉得单一的说谁效率高有些片面,因为不同的情况会产生不同的结果;for 可能在某些方面比 foreach 效率高,而 foreach 在另一些方面又比 for 效率高。下面举两个实例,一个是查找字符串,另一个是查找整数。
1、查找字符串:
程序通过不断产生随机字符串组成 list 列表,然后再从 list 列表中查找字符中“abc”,找到后跳出循环,具体程序如下:
//测试for和foreach 效率
public void for_foreach()
{
IList<string> list = new List<string>();
string str = "agfeywskjfjdks;glywiiraqeopmnbvcxz";
for (int i = 0; i < 100000; i++)
list.Add(Randoms(str, 3));
int count = list.Count;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < count; i++)
{
if (list[i] == "abc")
break;
}
sw.Stop();
lblRunTime.Text += "for 用的时间:" + sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();
foreach(string s in list)
{
if (s == "abc")
break;
}
sw.Stop();
lblRunTime.Text += ";foreach 用的时间:" + sw.ElapsedMilliseconds;
}
//生成随机数
public string Randoms(string c, int n)
{
StringBuilder sb = new StringBuilder(n);
int oneNum;
Random rnd = new Random();
for (int i = 0; i < n; i++)
{
oneNum = rnd.Next(c.Length);
sb.Append(c[oneNum]);
}
return sb.ToString();
}
以下是几组运行耗时数据(单位:ms):
for 用的时间:2;foreach 用的时间:3;
for 用的时间:4;foreach 用的时间:6;
for 用的时间:3;foreach 用的时间:4;
for 用的时间:5;foreach 用的时间:4;
for 用的时间:2;foreach 用的时间:2;
经比较可知,for 用的时间约少于 foreach,只有一组两者用的时间是相同的,一组 foreach 用的时间比 for 少,总体来说还是 for 效率约高于 foreach。
2、查找整数
程序通过 for 循环向 list 列表中添加整数,然后从 list 列表中查找 99999,找到则退出循环,具体程序如下:
//测试for和foreach 效率
public void for_foreach_num()
{
IList<int> ls = new List<int>();
for (int i = 0; i < 100000; i++)
ls.Add(i);
int n = ls.Count;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < n; i++)
{
if (ls[i] == 99999)
break;
}
sw.Stop();
lblRunTime.Text += "for 用的时间:" + sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();
foreach (int i in ls)
{
if (i == 99999)
break;
}
sw.Stop();
lblRunTime.Text += ";foreach 用的时间:" + sw.ElapsedMilliseconds;
}
几组运行耗时结果如下(单位:ms):
for 用的时间:1;foreach 用的时间:2
for 用的时间:2;foreach 用的时间:2
for 用的时间:2;foreach 用的时间:3
for 用的时间:1;foreach 用的时间:3
经比较可知,在四组数据中,只有一组用时相同,其它三组都是 for 用时约比 foreach 少,即 for 效率约比 foreach 高。
以上所举实例都是 for 的效率约高于 foreach,但这并不代表所有情况 for 都占优。其实在循环次数不是特别多的时候,它们的效率差别完全可以忽略不计;如果在编程过程中,遇到特别大的数据集,无法决定是用 for 还是用 foreach,可以先测试一下它们的效率,解除后顾之忧。