分析 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;
}
}
}
布尔
运算符&&
和||
的评估模型是明确定义的。仅当无法从第一个操作数得出答案时,才会计算第二个操作数。
这称为短路。这是有保证的行为。
这不是编译器或 JIT 的优化。
您可以依靠这一点,但在我看来,出于性能原因,这样做会使代码变得脆弱且容易出错。对于未来的维护者来说,为什么评估的顺序必须这样可能并不明显,尽管似乎没有明显的依赖关系。也许你可以用Lazy<T>
来获得懒惰的评估?!
永远不会
调用NeedALongTime
方法。C# 在能够确定结果后立即停止计算逻辑表达式。
这称为短路,与任何类型的分析无关。这是语言计算逻辑表达式的方式。如果使用返回 true
而不是 true
值的方法,则短路仍然有效,并且不会调用NeedALongTime
。
像 C# 和 C++ 这样的语言使用短路,而其他语言(如 VB.NET 则不使用。
使用短路时应小心。虽然最好对表达式进行排序,以便最可能的情况首先发生,但在某些情况下,为了提高性能而在表达式中注入短路标志是非常糟糕的做法。
最好对此类条件语句使用不同的if
语句。生成的 IL 代码将相同,但代码将更清晰。
或者具有多个繁重方法的条件,最好将它们捆绑在代码开头,甚至将条件检查提取到单独的函数中。这样,您可以避免将保护条件与实际业务逻辑混淆