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