【问题标题】:Performance of repeated getter calls vs. saving value in a local variable重复 getter 调用的性能与将值保存在局部变量中
【发布时间】:2019-01-20 00:28:46
【问题描述】:

以下选项之一是否比另一个更好?有哪些性能注意事项?

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) 属性永远不会改变(不需要获取它的“当前”版本) .

【问题讨论】:

    标签: java


    【解决方案1】:

    编译器可能足够聪明,可以将选项 A 优化成类似于选项 B 的东西,所以在这里我假设编译器没有优化。

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

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

    如果您现在甚至没有性能问题,请不要担心这个问题。等到您确实看到您的代码运行缓慢,然后使用分析器检查。

    【讨论】:

    • 所有开发人员都应该尝试分析他们的代码,即使没有明显的问题。我敢打赌,如果您要问元问题“当您查看代码配置文件时,您有多少次感到惊讶”,那么您会得到很多等同于“是的,我也是”的赞成票。
    • "如果您现在甚至没有性能问题,请不要担心这个问题。等到您确实看到您的代码运行缓慢,然后使用分析器进行检查。"完全不同意这一点,因为这会鼓励性能不佳的代码,尤其是在使用编译器未优化重复 getter 调用的语言编写时。
    【解决方案2】:

    在你的这种情况下,我愿意建议,你应该在这里考虑所有的角度,

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

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

    当人们在不同级别的任务上有不同的偏好场景时,我真的不能说哪个表现好。

    相反,我可以为您提供一些信息,这将在您以后去的时候帮助您:Some Data Loading Concepts

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多