【发布时间】:2010-09-08 21:09:09
【问题描述】:
假设我们有一个像这样的值类型,其中的字段是readonly,并在构造过程中初始化:
public struct SomeValue
{
private readonly Int32 field1;
private readonly Int32 field2;
...
}
另外,假设我们有一个帮助类,可以让我们以可重用的方式为复合类型实现GetHashCode():
public struct SomeValue
{
...
public override Int32 GetHashCode()
{
return HashHelpers.GetHashCode(this.field1, this.field2);
}
}
现在,编译器必须意识到在构造类型之后字段值永远不会改变,因为它们是readonly。因此,当 SomeValue.GetHashCode() 被 JIT 编辑时,对 HashHelpers.GetHashCode() 的调用是否会以某种方式被内联?
【问题讨论】:
-
你说的不是内联,而是短路 GetHashCode 实现。
-
@Simon:在这种情况下,短路是什么意思?请详细说明。
-
您希望 SomeValue.GetHashCode 直接返回预先计算(在上次调用期间计算)的值。 (通过 SomeValue.GetHashCode 创建更快的路径,短路。)内联意味着 HashHelpers.GetHashCode 的代码将(假设满足某些条件)插入到 SomeValue.GetHashCode 中以加快执行速度(通过避免使用该方法调用需要堆栈修改、执行跳转等)。我只是说你所描述的不是内联。
-
听起来您希望(或至少询问)CLR 具有某种能力来确定方法调用是否是确定性的(相同的输入 => 相同的输出)并将它们短路通过将它们替换为先前执行的缓存值来调用。
-
@Simon:啊,我明白你的意思了。我想这已经达到了极端,可能就是我的意思,但我实际上确实是指内联,就像在没有函数调用的情况下执行完全相同的计算序列一样开销。
标签: c# optimization clr inline jit