Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用静态类,比立即使用慢吗?_C#_Performance_Class - Fatal编程技术网

C# 使用静态类,比立即使用慢吗?

C# 使用静态类,比立即使用慢吗?,c#,performance,class,C#,Performance,Class,我注意到,如果我使用静态类中的代码,它比直接在需要的地方运行要慢 例如: static class FastMethods { public static byte[] GetBytes(int index, long value) { byte[] target = new byte[sizeof(Int32)]; target[index++] = (byte)value; target[index++] = (byte)(va

我注意到,如果我使用静态类中的代码,它比直接在需要的地方运行要慢

例如:

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。

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

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

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

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

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

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

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


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

您是否在测试优化的代码?如果不是,所有获得的数据都是无意义的。优化代码?你指的是复选框,如果是,是的,它被选中了。至于数据,我想你是指结果?是的,编译为发布版本,或者运行时没有附加调试器,或者确保调试选项中的“禁用JIT优化”复选框未选中。我想我们讨论的是两个不同的复选框。我的意思是构建“优化代码”中的一个在调试中看不到任何东西。您必须以调试->启动而不调试(CTRL+F5)的方式运行它。您正在测试优化的代码吗?如果不是,所有获得的数据都是无意义的。优化代码?你指的是复选框,如果是,是的,它被选中了。至于数据,我想你是指结果?是的,编译为发布版本,或者运行时没有附加调试器,或者确保调试选项中的“禁用JIT优化”复选框未选中。我想我们讨论的是两个不同的复选框。我的意思是构建“优化代码”中的一个在调试中看不到任何东西。你必须以调试->启动而不调试(CTRL+F5)的方式运行它。在发布模式下这也很重要吗?同一个类中的Static也有关系吗?当然,除非代码是内联的。这是由JIT编译器控制的,只有在启用优化时才能完成。它还依赖于各种启发式方法,这里最重要的一种是,代码的大小是否取决于没有附加调试器时,无法判断代码是否是内联的,但是如果代码在放入方法时可读性更强,并且可以重复使用,那么将其放入方法中是一个更好的决定。听过这个“内联”吗很多次,但我不明白它的意思。因此,无论采用何种方法,都应选择单独的类。它会使事情变慢,而且将所有代码放在应该放的地方会更快。但成本较低的是组织代码?内联意味着代码是在同一方法中生成的。它可能会慢半毫秒左右,但这不是给定的,因为当调试器未被附加时,代码可能由JIT内联或不内联。在发布模式下这也很重要吗?同一个类中的Static也有关系吗?当然,除非代码是内联的。这是由JIT编译器控制的,只有在启用优化时才能完成。它还依赖于各种启发式方法,这里最重要的一种是,代码的大小是否取决于没有附加调试器时,无法判断代码是否是内联的,但是如果代码在放入方法时可读性更强,并且可以重复使用,那么将其放入方法中是一个更好的决定。听过这个“内联”吗很多次,但我不明白它的意思。因此,无论采用何种方法,都应选择单独的类。它会使事情变慢,而且将所有代码放在应该放的地方会更快。但成本较低的是组织代码?内联意味着代码是在同一方法中生成的。它可能会慢半毫秒左右,但这不是给定的,因为当没有附加调试器时,代码可能由JIT内联,也可能不由JIT内联