我的作品使用了大量的类实例。
对于内存优化,我想知道静态方法的使用是否优于简单的函数
感谢您对优化管理大量对象的任何建议。
答案 0 :(得分:3)
之间没有区别
public class Foo
{
public Bar bar;
public Bar baz;
public bool Qux()
{
return this.bar != null;
}
}
和
public class Foo
{
public Bar bar;
public Bar baz;
public static bool Qux(Foo foo)
{
return foo.bar != null;
}
}
就单个实例的内存消耗而言。方法每个类消耗内存,而不是每个实例。
如果当然,您可以通过不创建实例来节省内存。因此,如果您的静态方法不需要实例,请选择静态方法。
答案 1 :(得分:2)
作为一般规则:您的方法的代码在实例之间共享 - 它并不像每个实例都获得它自己的方法副本。您可能想要了解如何管理实例data
,但我想到了flyweight pattern。
答案 2 :(得分:1)
只有在完全确定之后,才建议伤害您的可读性或更改性能问题的逻辑无论您打算做什么都会有很大帮助。这不是这里的情况,因为你的解决方案从一开始就没有真正的帮助,更不用说“显着”了。所以你的问题的答案是“不”。
答案 3 :(得分:0)
该类是否存储任何实例数据或使用任何实例数据来执行该方法?然后静态方法将无效。
如果该方法不使用该类的任何实例数据,那么使该方法静态将起作用。
如果您无法使您感兴趣的方法成为静态,则可以考虑为对象实现池。
当您需要一个实例时,您可以从池中获取一个实例,使用它,然后在完成后将其返回池中。这样你就不必创建任意数量的实例(当然,这假定你创建的许多实例经常不被使用)。
答案 4 :(得分:0)
让你的方法保持静态不应该对你班级的足迹造成很大的影响。如果你最终只是为了调用一个成员方法来实例化你的类,那么静态可能会有所不同。
如果因许多实例导致内存消耗是个问题,您可能需要查看Flyweight pattern
答案 5 :(得分:0)
其他人的意见很好。我只想补充一点,如果以高速率创建和销毁实例,您将在内存管理中浪费大量时间。您可以通过保留已使用对象池来纠正它,并重新使用它们而无需转到内存分配器。
答案 6 :(得分:0)
方法始终附加到类,而不是实例。内存中实例的大小不依赖于方法计数。因此,使用静态或实例变量与内存优化无关。