分析 if 语句以优化性能

本文关键字:优化 性能 语句 if 分析 | 更新日期: 2023-09-27 18:36:37

在 C# 中,是否在执行之前分析了所有 if 语句,以便在 if 语句不能为真的情况下(在证明所有条件之前)将被取消?

我的问题是,我想摆脱多个 if 语句,因为 if 语句中的某些方法需要很长时间才能执行(如果执行它们,这是浪费时间)。

这是一个简单的 if 语句(这里有效)。但是这对复杂的 if 语句有多好?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace IfTest
{
    class Program
    {
        static void Main(string[] args)
        {
            if (true || NeedALongTime())
            {
                Console.WriteLine("!");
            }
            Console.ReadLine();
        }
        private static bool NeedALongTime()
        {
            Thread.Sleep(10000);
            return true;
        }
    }
}

分析 if 语句以优化性能

布尔

运算符&&||的评估模型是明确定义的。仅当无法从第一个操作数得出答案时,才会计算第二个操作数。

这称为短路。这是有保证的行为。

这不是编译器或 JIT 的优化。

您可以依靠这一点,但在我看来,出于性能原因,这样做会使代码变得脆弱且容易出错。对于未来的维护者来说,为什么评估的顺序必须这样可能并不明显,尽管似乎没有明显的依赖关系。也许你可以用Lazy<T>来获得懒惰的评估?!

永远不会

调用NeedALongTime方法。C# 在能够确定结果后立即停止计算逻辑表达式。

这称为短路,与任何类型的分析无关。这是语言计算逻辑表达式的方式。如果使用返回 true 而不是 true 值的方法,则短路仍然有效,并且不会调用NeedALongTime

像 C# 和 C++ 这样的语言使用短路,而其他语言(如 VB.NET 则不使用。

使用短路时应小心。虽然最好对表达式进行排序,以便最可能的情况首先发生,但在某些情况下,为了提高性能而在表达式中注入短路标志是非常糟糕的做法。

最好

对此类条件语句使用不同的if语句。生成的 IL 代码将相同,但代码将更清晰。

如果需要在执行方法之前检查多个条件,

或者具有多个繁重方法的条件,最好将它们捆绑在代码开头,甚至将条件检查提取到单独的函数中。这样,您可以避免将保护条件与实际业务逻辑混淆