为返回类型创建静态实例变量

时间:2017-07-25 10:20:29

标签: java performance

我的游戏循环大约以60 fps运行。在每次迭代中,我需要从我的实用程序类Physics中调用一堆方法。看起来像这样

public final class Physics {

    private static final float G = 9.81f;
    private static Vector2D var1 = new Vector2D();

    private Physics() {
    }

    public static Vector2D method1(param1, param2, param3) {
        /*
         * Do some computations with param1, param2 and param3, 
         * then assign the result to var1
         */
        return var1;
    }
}

这种设计模式的优点和缺点是什么?使用var1作为帮助器实例变量是不错的,就像我在上面的代码中所做的那样,因为如果我将它放在method1()内,如下所示

    public static Vector2D method1(param1, param2, param3) {
        Vector2D var1 = new Vector2D();
        /*
         * Do some computations with param1, param2 and param3, 
         * then assign the result to var1
         */
        return var1;
    }

每秒我得到60个Vector2D类型的新对象,我想避免垃圾回收。

4 个答案:

答案 0 :(得分:1)

我总是尽量减少变量范围(可读性),除非有充分的理由不显示或显着的性能优势。在这种情况下,我假设Vector2D不会使用太多开销,并且制作静态变量的性能优势可能是可以忽略的。

因此,如果您不打算从方法1中的其他位置访问var1,我建议您使用第二种设计模式。如果可能的话,你不必在方法中声明varable,如下所示:

public static Vector2D method1(param1, param2, param3) {
    // Do some computations, compute x and y, then assign the result to var1
    return new Vector2D(x, y);
}

最后,这是个人品味的问题。

答案 1 :(得分:1)

除非Vector2D构造函数执行异常操作,否则每秒创建60个实例与性能方面完全无关。在考虑性能之前,需要明确代码。

答案 2 :(得分:1)

如果你有多个Physics个实例,那么将它设为静态几乎肯定会破坏它。如果目标是减少创建的对象数量,您将从非静态字段获得相同的效果:

private Vector2D var1 = new Vector2D();

如果您想减少要创建的对象数量,我会使用Object Pool pattern。每次从池中请求一个对象时,不是构造一个新的Vector2D,而是构造一个新对象或者回收一个旧对象。

Vector2D obj = Vector2D.get(x, y, z ...);

在这种情况下,对象池将是某种Collection作为Vector2D的静态成员。这取决于Vector2D个实例being immutable,无论如何they should be

如果您未经过测试并确保此对象创建实际上是一个问题,那么这有点极端。除非知道存在性能问题,否则永远不要优化性能代码。

答案 3 :(得分:0)

正如你所说,你需要每秒运行你的代码60次,你可以考虑这个可以提高代码性能的重要事项。

  • Singleton设计模式(为整个应用程序提供单个实例)

建议您在不进行任何特殊计算时使用Singleton实例,而只是调用方法为您计算。

如果你只需要一个类的对象来调用任何特定方法,使用单例是值得的,该方法在方法范围之外无需做任何事情。 这意味着,如果您的method1(param 1, ...)仅仅基于给定值并且不影响任何其他实例变量或不调用任何其他非单身类成员,那么您必须采用单身设计模式。

如果它令人困惑,请再次阅读。