我想说我想设计一个返回给定股票信息的函数。该函数接收股票名称作为String类型的参数,然后返回多个值。它可能返回的一些值是:
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,内存和序列化方面的性能。
这个问题只是我实际拥有的一个更大问题的隐喻,只是在更大规模上需要更多解释。因此,即使在这个小例子中差异可以忽略不计,它在我的实际情况中也会扩大到更为重要。
答案 0 :(得分:1)
从优化的角度来看 最好的做法是返回一个Stock对象,因为强制转换会导致更多的cpu和内存使用,甚至会导致像classCastException这样的异常,如果在任何情况下你都错过了变量
所以,
return new Stock(price, profitability, currentTrend, mostRecentSpike, timeOfRecentSpike);
答案 1 :(得分:1)
我将把评论总结为一个连贯的答案,因为那些答案我的问题很多。
<强> markspace:强>
由于Arrays是Java中的对象,它们将具有与Stock自定义类相似的结构,因此需要基本相同的内存和CPU资源。
自定义类从序列化的角度来看具有优势,因为它具有固定的序列化ID,如果需要,也可以自定义。
自定义类还提高了可读性。
Andy Turner:
使用Object [],每个输入的值都将成为一个Object,当你从该Array中检索元素时,你需要将它们从Object插入到它们的非原始对应物(Long,Double,Integer)中,它们有一些开销。使用自定义类,您将把所有内容存储为基元,因此不需要装箱,因此没有开销。
此外,如果您考虑在自定义类中使用非原始值,则从内存角度来看情况更糟。如果字段的类型为int
,则将其存储为Integer
的内存效率要高出4倍。
答案 2 :(得分:0)
当你说
时它会在我的实际情况中扩大到更重要的程度。
我怀疑你实际上没有数据可以证明这一点(好像你有,我怀疑你会在这里问......)
我建议你用尽可能最清晰的方式写它,这可能包括传递对实际物体的引用,直到你实际上有数据证明这是一个真正的问题。 (99%的情况下,“明显的”时间下沉不是)