【发布时间】:2011-05-20 20:26:40
【问题描述】:
假设我有一个收藏
列表
list = new List ();
现在哪个愚蠢的循环会运行得更快,为什么:
for(int i=0;i
或
foreach(列表中的Foo foo)
【问题讨论】:
-
如上述重复问题所述:如果您遇到性能问题,几乎可以肯定不是因此
假设我有一个收藏
列表
list = new List ();
现在哪个愚蠢的循环会运行得更快,为什么:
for(int i=0;i
或
foreach(列表中的Foo foo)
【问题讨论】:
谁在乎?你有性能问题吗?如果是,您是否测量并确定这是您的应用程序中最慢的部分?
【讨论】:
嗯.. 您可以使用System.Diagnostics.StopWatch 找到答案。
然而重点是,你为什么需要考虑它。您应该首先考虑哪个更具可读性并使用那个而不是在这种情况下为性能而烦恼。
黄金法则始终是编写可读的代码并在发现性能问题时进行优化。
【讨论】:
如果需要使用当前项的索引,使用for循环。没有faster 解决方案,你只有proper 解决方案。
【讨论】:
foreach 对我来说打字速度更快 :) 并且更易于阅读。
【讨论】:
这取决于:
对于For 循环,它位于How much time does it take to evaluate the value oflist.Countor whatever value is provided in condition 和How much time does it take to reference item at specific index。
对于Foreach 循环,它依赖于How much time it takes for an iterator to return a value。
对于您上面的示例,应该没有任何区别,因为您使用的是标准 List 类。
【讨论】:
我没有支持这一点的来源,但我相信由于编译器进行循环展开等优化的方式,它们几乎如果不完全相同的话。如果有差异,很可能是单个或数十个 CPU 周期的数量级,这对于 99.9999% 的应用程序来说无异于无。
一般来说,foreach 往往被认为是“语法糖”,也就是说,拥有它很不错,但实际上除了改变您对特定代码段的措辞方式之外并没有太大作用。
【讨论】:
试试这个,for 和 foreach 几乎同时产生,但是 .ForEach() 方法更快
class Program
{
static void Main(string[] args)
{
//Add values
List<objClass> lst1 = new List<objClass>();
for (int i = 0; i < 9000000; i++)
{
lst1.Add(new objClass("1", ""));
}
//For loop
DateTime startTime = DateTime.Now;
for (int i = 0; i < 9000000; i++)
{
lst1[i]._s1 = lst1[i]._s2;
}
Console.WriteLine((DateTime.Now - startTime).ToString());
//ForEach Action
startTime = DateTime.Now;
lst1.ForEach(s => { s._s1 = s._s2; });
Console.WriteLine((DateTime.Now - startTime).ToString());
//foreach normal loop
startTime = DateTime.Now;
foreach (objClass s in lst1)
{
s._s1 = s._s2;
}
Console.WriteLine((DateTime.Now - startTime).ToString());
}
public class objClass
{
public string _s1 { get; set; }
public string _s2 { get; set; }
public objClass(string _s1, string _s2)
{
this._s1 = _s1;
this._s2 = _s2;
}
}
}
【讨论】: