优化获取参数值

时间:2019-05-08 16:02:53

标签: java performance

我想知道这两种在Java中获取参数值的方法之间在性能上是否有差异:

选项1:

for(int i=0; i<1000; i++) {
    System.out.println(object.getName());
}

选项2:

String name = object.getName();
for(int i=0; i<1000; i++) {
   System.out.println(name);
}

也许只有1个属性(名称),选项2更好,但是,如果我有50个不同的属性怎么办?我会浪费存储这些变量的内存。

请在拥有大量用户访问WebApp的庞大系统中大放异彩。

1 个答案:

答案 0 :(得分:2)

第一个选项应运行object.getName() 1000次,另一个则仅运行一次。

因此,是的,显然,应该会对性能产生一定的影响。语义上也有细微的差别:如果该名称不是不变的,则在该循环运行时其他线程可能会更改它。然后选项2 可能会在某个随机时间点接受该更改,而选项1则不会这样做。

关于性能方面:在Java中,真的很难确定这种微妙的代码更改的影响。当该循环运行10万次时,即时编译器将进入并使用诸如方法内联,循环展开,常量折叠之类的技术将所有内容转换为高度优化的机器代码。它甚至可能检测到object.getName()没有副作用,因此将您的代码转换为选项2片段中的内容。所有这些操作都在运行时发生,具体取决于JVM在运行代码时为JIT收集的分析信息。

因此,关于“ java性能”的典型答案是:避免愚蠢的错误(在循环内调用没有副作用的方法 会是这样的错误),但是不要期望有人会告诉您“是的,选项1的运行速度将提高500毫秒”。 Java中的“真正”性能提升是由JIT创造的(当然:您的实现的巧妙设计)。因此,很难预测运行时中此或该源代码伪造品将具有什么。

最后:请注意,使用System.out.println()非常昂贵。因此,当您的getName()实际上只是从内存中获取属性时,将该值 printing 到控制台的价格可能比获取这些值要高出几倍!