每个循环都会对while语句中的三元表达式进行求值

时间:2017-01-04 20:49:25

标签: c#

我有一个简单的循环来计算两个数字的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编译器

2 个答案:

答案 0 :(得分:2)

是的,while语句怎么会知道何时完成?它需要在每次迭代时完整地重新计算表达式,以便知道何时可以退出循环。

话虽如此,当CIL被创建时,它很可能会将其优化出来。

答案 1 :(得分:2)

实际上这取决于。如果任何表达式(或任何子表达式,特定类型的子表达式不重要且子表达式的位置,即在循环的条件下或循环体内部也不重要)也不依赖于在循环,可以移出循环并只计算一次,优化器将执行此操作。 C#有很好的优化器。

在调试版本中,不会优化任何内容。每个表达式都将重新计算。

作为第一优先,我建议提高代码的清晰度和可读性。除此之外,尽量减少开发工作代码的时间。您需要仅在关键代码段中帮助优化器,或者当您看到由于某种原因优化器没有做好工作时。很少,但有时会发生这种情况。

相关问题