gpt4 book ai didi

c# - 是否可以在 C# 中使用分支预测提示?

转载 作者:IT王子 更新时间:2023-10-29 04:48:51 26 4
gpt4 key购买 nike

例如,我知道它是为 gcc 定义的,并在 Linux 内核中用作:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

如果在 C# 中没有这样的可能,那么最好的替代方法是手动重新排序 if 语句,将最可能的情况放在第一位吗?是否有其他方法可以根据此类外部知识进行优化?

在相关说明中,CLR 知道如何识别保护子句并假定将采用替代分支,这使得这种优化不适合用于保护类,对吗?

(请注意,我意识到这可能是一个微优化;我只对学术目的感兴趣。)

最佳答案

简短回答:否。

更长的答案:在大多数情况下,您真的不需要。您可以通过更改语句中的逻辑来提供提示。使用性能工具更容易做到这一点,例如内置在更高(和更昂贵)版本的 Visual Studio 中的工具,因为您可以捕获预测错误的分支计数器。我知道这是出于学术目的,但很高兴知道 JITer 非常擅长为您优化代码。作为一个例子(几乎逐字地从 CLR via C# 中获取)

这段代码:

public static void Main() {
Int32[] a = new Int32[5];
for(Int32 index = 0; index < a.Length; index++) {
// Do something with a[index]
}
}

可能看起来效率低下,因为 a.Length 是一个属性,正如我们在 C# 中所知,属性实际上是一组一个或两个方法 (get_XXXset_XXX)。但是,JIT 知道它是一个属性,并为您将长度存储在局部变量中,或者内联该方法以防止开销。

...some developers have underestimated the abilities of the JIT compiler and have tried to write “clever code” in an attempt to help the JIT compiler. However, any clever attempts that you come up with will almost certainly impact performance negatively and make your code harder to read, reducing its maintainability.

除其他外,它实际上更进一步,在循环外部而不是循环内部进行一次边界检查,这会降低性能。

我意识到这与您的问题没有直接关系,但我想我想表达的意思是像这样的微优化在 C# 中并不能真正帮助您,因为 JIT 通常会这样做更好,因为它正是为此而设计的。 (有趣的是,x86 JIT 编译器比 x64 编译器执行更积极的优化)

This article解释了 .NET 3.5 SP1 中添加的一些优化,其中包括对拉直分支的改进,以改进预测和缓存局部性。

综上所述,如果您想阅读一本关于编译器生成的内容和 CLR 性能的好书,我推荐我从上面引用的书,CLR via C#。

编辑:我应该提一下,如果这在 .NET 中目前是可能的,您可以在 EMCA-335 standard 中找到信息。或 working draft .没有支持这一点的标准,并且在 IlDasm 或 CFF Explorer 之类的东西中查看元数据没有显示任何可以暗示分支预测的特殊元数据的迹象。

关于c# - 是否可以在 C# 中使用分支预测提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8873943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com