【发布时间】:2010-06-25 17:25:57
【问题描述】:
我开始使用 Resharper,它指出了何时可以将方法 设为静态。将几百个方法转换为静态方法会在很长一段时间内增加内存占用吗?
【问题讨论】:
标签: c# garbage-collection static-methods
我开始使用 Resharper,它指出了何时可以将方法 设为静态。将几百个方法转换为静态方法会在很长一段时间内增加内存占用吗?
【问题讨论】:
标签: c# garbage-collection static-methods
否 - 更改为静态方法对内存没有影响。
第一次引用类型时(无论是静态的还是非静态的),都会初始化所有静态成员并运行静态构造函数。
但是,如果您只是考虑将方法从非静态切换到静态,这不会影响垃圾收集或总内存占用。
如果您将类成员更改为静态成员,您只需要担心内存占用的变化。在这种情况下,一旦类型被访问,静态字段将保持根,并且不会被 GC 收集。这通常只在必要时进行,并且是有意为之 - 您将成员设为静态是因为您希望它持久存在。
【讨论】:
从 JIT 编译器的角度来看,静态方法和实例方法没有区别。它们的机器代码非常相似,存储在同一种堆中。唯一的区别是实例方法有一个额外的参数。
调用方法时需要传递额外的参数。这可能会花费额外的机器代码指令,但不会那么频繁。 CPU 寄存器 (ECX) 通常已经具有正确的值。如果实例方法在 x86 上具有多个参数或在 x64 上具有三个以上参数,则存在差异,则必须在堆栈上而不是通过 CPU 寄存器传递额外的参数。一条额外的指令。
最坏的情况是,您看到的时间不到一纳秒。这将很难衡量,这是微优化的常见问题。
【讨论】: