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

时间:2019-01-19 15:53:03

标签: java

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

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)该属性从未更改(无需获取它的“当前”版本)

2 个答案:

答案 0 :(得分:3)

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

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

但是速度事项的差异吗?您必须使用分析器进行检查。 如有疑问,请使用探查器。如果这实际上并没有引起性能瓶颈,那么将选项A更改为B不会有帮助。

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

答案 1 :(得分:-1)

在这种情况下,我愿意建议您在这里进行所有思考,

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

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

当人们在不同级别的任务上有不同的喜好场景时,我不能真正说出哪种表现很好。

相反,我可以为您提供一些信息,这些信息将在您将来使用时为您提供帮助:Some Data Loading Concepts

希望对您有帮助。

相关问题