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内联