【发布时间】:2012-02-11 00:51:57
【问题描述】:
例如,我知道它是为 gcc 定义的,并在 Linux 内核中用作:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
如果在 C# 中不可能有这样的事情,那么手动重新排序 if 语句的最佳替代方案是,将最可能的情况放在首位?有没有其他方法可以基于这种外部知识进行优化?
在相关说明中,CLR 知道如何识别保护子句并假设将采用备用分支,这使得这种优化不适用于保护子句,对吗?
(请注意,我意识到这可能是一个微优化;我只对学术目的感兴趣。)
【问题讨论】:
-
当 C# 编译到 IL 时,你会怎么做呢?
-
答案是“不,不可能”。 Oded 指出了这种不可能的理由。
-
我想我希望它可以在 IL 中完成,因为 IL 被编译为本地代码,可以使用提示指令。或者,任何其他类似的技术,即使不是在处理器级别也会感兴趣(尽管我不确定这是否可能)。
-
@Oded, Heath:这并不是不可能的。 MSIL 携带各种元数据,描述局部变量的类型、异常尝试/捕获块等。如果 .NET 设计者为它包含了编码,那么就有可能拥有用于分支预测的元数据。
-
@BenVoigt - 没错,但是,没有这样的编码,所以实际上,这目前是不可能的。
标签: c# .net optimization clr