gpt4 book ai didi

java - 在 block 中连续使用相同的方法会重新计算该方法吗?

转载 作者:行者123 更新时间:2023-12-02 02:26:55 25 4
gpt4 key购买 nike

我总是假设每次调用 Java 中的方法时该方法都会再次执行。我假设返回值不会自动存储,除非我将其存储在变量中。

然后我在 Princeton's algs4.BST class 中遇到了这段代码他们分别调用三个方法两次:

private boolean check() {
if (!isBST()) StdOut.println("Not in symmetric order");
if (!isSizeConsistent()) StdOut.println("Subtree counts not consistent");
if (!isRankConsistent()) StdOut.println("Ranks not consistent");
return isBST() && isSizeConsistent() && isRankConsistent();
}

他们根本不关心性能吗?或者编译器是否足够聪明,保留每个方法的第一个返回值以在 return 语句中使用?

抱歉,如果这是重复的,似乎这个答案应该存在,但我在此处或 Java 文档中找不到它。我找到了这些(和其他),但它们没有回答我的问题:

Is this the cleanest way to repeat method call in Java?

How to call a method without repeat from other methods in java

最佳答案

Java 语言规范明确且无条件地规定,方法调用表达式的求值涉及执行指定方法的代码。 JLS 8 是这样说的:

At run time, method invocation requires five steps. First, a target reference may be computed. Second, the argument expressions are evaluated. Third, the accessibility of the method to be invoked is checked. Fourth, the actual code for the method to be executed is located. Fifth, a new activation frame is created, synchronization is performed if necessary, and control is transferred to the method code.

(JLS 8, 15.12.4;已添加强调)

因此,无论是否可以预期计算出相同的值,第二次调用一个方法都会产生第二次的成本。可以想象,JIT 编译可以对此进行优化,但是除了是否计算相同的结果之外,还有更多的考虑因素,并且您无论如何都不太可能看到仅两次调用给定方法而触发的任何 JIT 操作。

底线:是的,代码的作者根本不关心性能。他们可能认为所提供的实现比避免冗余方法调用的实现更清晰,或者他们可能有其他一些个人原因做出选择。这种对实用性的漠视在服务于学术目的的代码中并不罕见,例如本文所介绍的代码。

关于java - 在 block 中连续使用相同的方法会重新计算该方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47663488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com