假设我有一个集合
列表< Foo> list = new List< Foo>();
现在哪个虚拟循环运行得更快以及原因:
for(int i = 0; i< list.Count; i ++)
或
foreach(列表中的Foo foo)
答案 0 :(得分:5)
取决于:
对于For
循环,它位于How much time does it take to evaluate the value of
list.Count or 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类。
答案 1 :(得分:2)
谁在乎?你有性能问题吗?如果是这样,您是否已经测量并确定这是您应用中最慢的部分?
答案 2 :(得分:2)
foreach为我打字更快:)更容易阅读。
答案 3 :(得分:1)
嗯..你可以使用System.Diagnostics.StopWatch
找到它。
但问题是,为什么你需要考虑它。在这种情况下,您应首先考虑哪一个更具可读性并使用该一个而不是打扰性能。
如果您发现性能问题,黄金法则始终是可写代码并进行优化。
答案 4 :(得分:1)
尝试这个,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;
}
}
}
答案 5 :(得分:0)
如果需要使用当前项的索引,请使用for
循环。没有faster
解决方案,您只有proper
解决方案。
答案 6 :(得分:-1)
我没有备份来支持这一点,但我相信由于编译器进行优化(例如循环展开)的方式,它们几乎完全相同。如果存在差异,则可能是单个或几十个CPU周期的顺序,对于99.9999%的应用程序来说,这一点都没有。
一般来说,foreach往往被认为是“语法糖”,也就是说,它很好用,但实际上除了改变你对特定代码片段的描述方式之外并没有做太多的事情。