0

我注意到如果我使用来自静态类的代码,它会比我直接在我想要的地方运行它要慢。

例如:

static class FastMethods
{
    public static byte[] GetBytes(int index, long value)
    {
        byte[] target = new byte[sizeof(Int32)];
        target[index++] = (byte)value;
        target[index++] = (byte)(value >> 8);
        target[index++] = (byte)(value >> 16);
        target[index] = (byte)(value >> 24);
        return target;
    }
}

有我想在一个单独的类中使用的代码,所以我可以让它更有条理。现在这比我这样做要慢:

int index = 0;
long value = ms.Length;
byte[] target = new byte[sizeof(Int32)];
target[index++] = (byte)value;
target[index++] = (byte)(value >> 8);
target[index++] = (byte)(value >> 16);
target[index] = (byte)(value >> 24);

两者都使用相同的数字做完全相同的事情。如果我使用静态类,我将只写如下内容:

var target = FastMethods.GetBytes(0,ms.Length);

所以,如果我没有完全迷失,它至少应该做同样的事情。

现在,当我说慢一点时,我的意思不是很多,我指的是蜱虫。从 1-3 个滴答声到 3-4 个滴答声。

它通常在 1-2,静态将在 3 左右,至少在我的简短测试中没有达到 1。

4

2 回答 2

2

与内联代码相比,方法调用总是有轻微的开销,因为在调用方法时会发生上下文更改。生成的 IL 指令(推送参数、调用指令)比内联代码多,但性能损失可以忽略不计。

于 2013-08-17T06:08:07.163 回答
2

所以,如果我没有完全迷失,它至少应该做同样的事情。

就获取值而言,它在做同样的事情,但在幕后还有更多事情要做。因为调用该方法有它自己的开销。

但它从来都不是很多,而且对于组织良好的代码来说,这是一个非常小的妥协。

于 2013-08-17T06:11:33.870 回答