繁体   English   中英

反复执行getter调用与将值保存在局部变量中

[英]Performance of repeated getter calls vs. saving value in a local variable

以下选项之一是否比另一个更好? 性能方面的考虑是什么?

class HelloWorld {
    String text = "Hello World";
    public String getText() {
        return this.text;
    }
}

HelloWorld helloWorld = new HelloWorld();

// option A:
for (int i = 0; i < HUGE_NUMBER; i++) System.out.println(helloWorld.getText());

// option B:
String text = helloWorld.getText();
for (int i = 0; i < HUGE_NUMBER; i++) System.out.println(text);

我要特别询问的情况是:(1)getter函数仅返回一个属性而无需执行额外的计算,(2)该属性从未更改(无需获取它的“当前”版本)。

编译器可能足够聪明,无论如何将选项A优化为类似于选项B的东西,因此在此我假定编译器并不乐观。

选项A涉及对getText许多调用以及对text字段的许多访问。 选项B调用一次getText并多次访问text变量。 因此,选项A将花费更长的时间,因为调用方法不是立即的。 该方法必须添加到调用堆栈中,并在返回时从堆栈中弹出。

但是这种速度差异重要吗? 您必须使用分析器进行检查。 如有疑问,请使用探查器。 如果这实际上不是造成性能瓶颈的原因,那么从选项A更改为B将无济于事。

如果您现在甚至没有性能问题,请不要再为此担心。 等待直到您看到代码运行缓慢,然后与分析器一起检查。

在您遇到这种情况时,我愿意建议您在这里多加考虑,

选项A-在执行System.out.println() getText()时直接调用函数getText() ,有人说System.out.println()这是一种不好的做法,除非您需要执行简单的任务。 有人说它会迅速停止生产线并做其他事情,然后再回到这里。

另一方面,选项B-它在内存中创建一个新变量并存储数据,这在时间和内存方面几乎是消耗的,但是当您打印数据时,它是非常快的。

我真的不能说当人们在不同级别的任务上有不同的优选方案时,哪种方法表现良好。

相反,我可以为您提供一些信息,这些信息将在您将来使用时为您提供帮助: 一些数据加载概念

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM