对于时间要求严格的C#代码,我应该对结构中的静态方法(非静态方法)进行评估吗?

时间:2015-03-03 10:53:43

标签: c# optimization compilation

从一些研究中,我知道下面的静态方法可以让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);
    }

}

2 个答案:

答案 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指令,该指令还会检查空对象引用。但是,大多数时候两者之间的性能差异并不显着。