for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
在 for 和 while 循环中,哪一个更好,性能明智?
for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
在 for 和 while 循环中,哪一个更好,性能明智?
(更新)实际上-在一种情况下for
构造效率更高;在数组上循环。只要您 arr.Length
在条件中使用,编译器/JIT 就会对此场景进行优化:
for(int i = 0 ; i < arr.Length ; i++) {
Console.WriteLine(arr[i]); // skips bounds check
}
在这种非常特殊的情况下,它会跳过边界检查,因为它已经知道它永远不会越界。有趣的是,如果您“提升”arr.Length
以尝试手动优化它,您可以防止这种情况发生:
int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
Console.WriteLine(arr[i]); // performs bounds check
}
但是,对于其他容器(List<T>
等),提升作为手动微优化是相当合理的。
(结束更新)
两者都不; 无论如何,一个 for 循环在引擎盖下被评估为一个 while 循环。
例如,ECMA 334(明确分配)的 12.3.3.9 规定了一个 for 循环:
for ( for-initializer ; for-condition ; for-iterator ) embedded-statement
本质上是等价的(从定义赋值的角度来看(与说“编译器必须生成这个 IL”不太一样))为:
{
for-initializer ;
while ( for-condition ) {
embedded-statement ;
LLoop:
for-iterator ;
}
}
将针对 for 语句的 continue 语句转换为针对标签 LLoop 的 goto 语句。如果从 for 语句中省略了 for-condition,则对明确赋值的求值会继续进行,就好像在上述扩展中 for-condition 被替换为 true。
现在,这并不意味着编译器必须做完全相同的事情,但实际上它几乎可以......
我会说它们是相同的,无论如何你都不应该做这样的微优化。
性能将是相同的。但是,除非您需要访问i
循环外的变量,否则您应该使用for
循环。这会更干净,因为i
只会在块内有范围。
程序效率来自适当的算法、良好的对象设计、智能程序架构等。
用 for 循环和 while 循环减少一两个循环永远不会使慢速程序变快,或使快速程序变慢。
如果您想在本节中提高程序性能,请找到一种方法来部分展开循环(请参阅Duff 的设备),或者提高循环内完成的操作的性能。
没有一个。它们是等价的。您可以认为“for”循环是编写 while 循环的更紧凑的方式。
是的,它们是等效的代码片段。