我有一个简单的循环来计算两个数字的hcf以取消分数。
我想知道是否在每个循环中重新计算while条件中的三元表达式,因此应该先计算一次并存储为变量以用于性能目的?
public Fraction LowestForm()
{
int hcf = 1;
int counter =2;
while (counter <= (Numerator < Denominator ? Numerator : Denominator))
{
if (Numerator % counter == 0 && Denominator % counter == 0)
{
hcf = counter;
}
counter++;
}
return new Fraction(Numerator / hcf, Denominator / hcf);
}
澄清一下:我主要关注Rosylyn编译器
答案 0 :(得分:2)
是的,while语句怎么会知道何时完成?它需要在每次迭代时完整地重新计算表达式,以便知道何时可以退出循环。
话虽如此,当CIL被创建时,它很可能会将其优化出来。
答案 1 :(得分:2)
实际上这取决于。如果任何表达式(或任何子表达式,特定类型的子表达式不重要且子表达式的位置,即在循环的条件下或循环体内部也不重要)也不依赖于在循环,可以移出循环并只计算一次,优化器将执行此操作。 C#有很好的优化器。
在调试版本中,不会优化任何内容。每个表达式都将重新计算。
作为第一优先,我建议提高代码的清晰度和可读性。除此之外,尽量减少开发工作代码的时间。您需要仅在关键代码段中帮助优化器,或者当您看到由于某种原因优化器没有做好工作时。很少,但有时会发生这种情况。