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
从“明确赋值”(Definite assignment)的角度来看,下面的代码:
int i;
i = 0;
与这段代码本质上是等价的:
int i = 0;
{
for-initializer ;
while ( for-condition ) {
embedded-statement ;
LLoop:
for-iterator ;
}
}
使用针对for语句的continue语句将被翻译为针对标签LLoop的goto语句。如果从for语句中省略了for条件,那么在上述扩展中,评估明确赋值会按照替换为true的方式进行。
现实情况并非如此,编译器不一定完全按照这种方式处理。
我认为它们是相同的,而且你永远不应该进行这样的微观优化。
性能将是相同的。但是,除非您需要在循环外部访问 i 变量,否则应使用for
循环。这样会更清洁,因为 i 仅在块内具有范围。
程序的效率来自于适当的算法、良好的对象设计、智能的程序架构等。
使用for循环和while循环来削减1-2个周期,永远不会使慢速程序变快,也不会使快速程序变慢。
如果您想在此部分改善程序性能,请找到一种方法来部分展开循环(参见达夫设备),或者改进循环内部操作的性能。
两者都一样。你可以把'for'循环看作是写while循环的更简洁方式。
是的,它们是等效的代码片段。