返回多个值的最佳做法?

时间:2018-05-22 17:54:21

标签: java performance memory optimization memory-management

我想说我想设计一个返回给定股票信息的函数。该函数接收股票名称作为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,内存和序列化方面的性能。

  • 哪个会占用更多CPU?
  • 哪会占用更多内存?
  • 哪个最适合序列化?

这个问题只是我实际拥有的一个更大问题的隐喻,只是在更大规模上需要更多解释。因此,即使在这个小例子中差异可以忽略不计,它在我的实际情况中也会扩大到更为重要。

3 个答案:

答案 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%的情况下,“明显的”时间下沉不是)