有一个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优化吗?
答案 0 :(得分:0)
如果在实际应用程序中,您将不会发现明显的性能差异。创建像Point这样的小对象不太可能成为性能瓶颈,因为大多数工作将在boat.setPosition()内部进行。 “过早的优化是万恶之源”(c)。 JVM优化是一门艺术,您仅凭查看就无法分辨出哪个代码更快(当然,除了明显的情况)。
考虑到这一点,您应该专注于代码的设计和可读性。通常进行拼接时,不应重复使用Point的小值对象。
在第一种方法中,您将在代码的许多地方使用同一对象,并且对该对象所做的任何更改都将在所有引用该对象的对象中可见,这使您的代码难以理解,维护并打开一个潜在的错误。
使用不可变对象(第二个代码段)的方法是一种更好的设计。在这种情况下,您应该倾向于使用不可变的对象。 JVM非常擅长管理小型短期对象。如果决定在代码中使用不可变对象,则可能需要研究https://immutables.github.io/或Kotlin数据类。