【发布时间】:2018-11-01 13:58:36
【问题描述】:
假设我想设计一个返回给定股票信息的函数。该函数接收股票名称作为字符串类型的参数,然后返回几个值。它可能返回的一些值是:
int price
int profitability
double currentTrend
int mostRecentSpike
long timeOfRecentSpike
如您所见,它们都是不同的原始类型。我想知道从优化的角度来看,返回这些值的最佳方法是什么。所以如果我要像这样制作一个自定义对象:
class Stock {
int price;
int profitability;
double currentTrend;
int mostRecentSpike;
long timeOfRecentSpike;
public Stock(int price, int profitability, double currentTrend, int mostRecentSpike, long timeOfRecentSpike) {
this.price = price;
this.profitability = profitability;
this.currentTrend = currentTrend;
this.mostRecentSpike = mostRecentSpike;
this.timeOfRecentSpike = timeOfRecentSpike;
}
}
并返回它,它会比我简单地返回这个的替代方案更好:
new Object[] {price, profitability, currentTrend, mostRecentSpike, timeOfRecentSpike}
然后将所有内容转换为适当的原始类型?虽然我知道返回和强制转换 Object[] 时可读性会降低,但我主要关心的是 CPU、内存和序列化方面的性能。
- 哪个会更占用 CPU 资源?
- 哪个会占用更多内存?
- 哪个最适合与序列化搭配使用?
这个问题只是我实际遇到的一个更大问题的隐喻,只是规模更大,需要更多解释。因此,即使在这个小例子中差异可以忽略不计,但在我的实际情况下,它会扩大到更加显着。
【问题讨论】:
-
“从优化的角度来看” - 为什么?您面临哪些性能问题?
-
CPU 和内存应该差不多(数组是 Java 中的对象,因此它们与您的对象相同)。自定义类最适合序列化,因为您可以给它一个固定的序列化 ID 并覆盖方法以在需要时提供自定义序列化。自定义类对于代码的可读性也更好。
-
返回
Stock,因此字段保留其类型和语义。 -
Fwiw,Google 将AutoValue 广泛用于此目的。
-
“因此,即使在这个小例子中差异可以忽略不计,但在我的实际情况下,它会放大到更加显着。”在
Object[]中返回所有内容的最大问题是您会丢失语义信息。第二个最大的问题是您必须将所有原语装箱,这会给您带来每个数组元素的开销。使用自定义类允许您将事物存储为原语,因此每个返回值只需承担一次开销。
标签: java performance memory optimization memory-management