从一些研究中,我知道下面的静态方法可以让JIT内联。但非静态的内容也可以内联吗?
如果代码确实是时间关键的,那么我是否应该重视这种静态方法而不是非静态方法呢?
public struct PixelData
{
public readonly uint raw;
public PixelData(uint raw)
{
this.raw = raw;
}
//JIT inlines this
static bool HasLineOfSight(PixelData p)
{
return (p.raw & 0x8000) != 0;
}
//But what about this?
int GetWeight()
{
return (int)(raw & 0x3FFF);
}
}
答案 0 :(得分:3)
您可以将[MethodImpl(MethodImplOptions.AggressiveInlining)]
应用于方法以尝试强制内联:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
int GetWeight()
{
return (int)(raw & 0x3FFF);
}
但是,从this programmer.se answer开始,您可以看到内联与非实际上没有什么区别:
结果
struct get property : 0.3097832 seconds struct inline get property : 0.3079076 seconds struct method call with params : 1.0925033 seconds struct inline method call with params : 1.0930666 seconds struct method call without params : 1.5211852 seconds struct intline method call without params : 1.2235001 seconds
你最好让编译器做它的事情,直到你发现你看到一些真正的可衡量的性能问题。
答案 1 :(得分:1)
MSDN:Static Classes and Static Class Members
对静态方法的调用会生成Microsoft中间语言(MSIL)中的调用指令,而对实例方法的调用会生成callvirt指令,该指令还会检查空对象引用。但是,大多数时候两者之间的性能差异并不显着。