在游戏循环中创建新对象与重用临时对象

时间:2018-12-01 12:55:53

标签: java

有一个Point类,其中包含两个浮点数并可以对其进行分配。还有一个Boat类的boat对象,它具有setPosition方法,该方法只能分配Point类。

    Point temp = new Point(0.0f, 0.0f);

    while (true) {
        temp.setX(boat.getX() + 1.0f);
        temp.setY(boat.getY());
        boat.setPosition(temp);
    }

vs

while (true) {
        boat.setPosition(new Point(boat.getX() + 1.0f, boat.getY()));
    }

第一种方法的执行速度是否会比第二种方法快?对我来说,第二个运行20亿次迭代的速度是第一个运行速度的两倍,难道它不应该由JVM优化吗?

1 个答案:

答案 0 :(得分:0)

如果在实际应用程序中,您将不会发现明显的性能差异。创建像Point这样的小对象不太可能成为性能瓶颈,因为大多数工作将在boat.setPosition()内部进行。 “过早的优化是万恶之源”(c)。 JVM优化是一门艺术,您仅凭查看就无法分辨出哪个代码更快(当然,除了明显的情况)。

考虑到这一点,您应该专注于代码的设计和可读性。通常进行拼接时,不应重复使用Point的小值对象。

在第一种方法中,您将在代码的许多地方使用同一对象,并且对该对象所做的任何更改都将在所有引用该对象的对象中可见,这使您的代码难以理解,维护并打开一个潜在的错误。

使用不可变对象(第二个代码段)的方法是一种更好的设计。在这种情况下,您应该倾向于使用不可变的对象。 JVM非常擅长管理小型短期对象。如果决定在代码中使用不可变对象,则可能需要研究https://immutables.github.io/或Kotlin数据类。