这是一个非常挑剔的问题,但好奇心让我变得更好。
每次循环执行时,for循环是否重新评估RHS条件?见下文。
for(int i = 0; i < collection.Count; i++)
{
}
在整个代码库中执行以下操作是否良好?
for(int i = 0, n = collections.Count; i < n; i++)
{
}
或者编译器是否进行了这些优化/它们可以忽略不计(即使代码库很大)?
答案 0 :(得分:9)
将在每次迭代之前重新评估条件(除非编译器检测到条件是常量),并且可以编写依赖于此的代码(例如调用返回值的函数)每次都会有所不同)。因此,如果您的评估条件很昂贵并且您确定它将保持不变,那么在循环之前对它进行一次评估确实是一个好主意。但是,对于大多数标准集合类型,Count
是一种快速操作,可忽略的性能增益不值得降低可读性。
答案 1 :(得分:2)
如果条件的权限是常量(因此它在循环内部不会改变)我相信优化器将collections.Count移动到循环顶部之外。如果在循环中修改了集合,那么它将每次都进行评估。
如果您使用foreach,您会注意到您无法更改循环内的枚举器,因为foreach使用此优化是一个更快的循环....
您总是可以编写一个带有几个循环的小型演示应用程序,其中一个循环在循环中修改,另一个不循环,然后在其上运行ildasm并查看生成的代码。