JVM/编译器会优化一个简单的超级方法调用吗?
Will the JVM / Compiler optimize a simple super method call?
所以如果我有
public void methodName() {
super.methodName();
}
编译器/JVM 将如何处理这个问题?假设签名相同,是否会像从未发生覆盖一样对待它?我想把这段代码作为意图的澄清,这样人们就不会想知道为什么 hashCode()
没有在与 equals()
相同的 class 中实现
如果它对系统有影响,也许不会。
好吧,通常问题是“JVM/编译器可以优化这个特定的方法调用吗?”不同于“Will it optimize said call?”,但你的实际问题是不同的。
你真正的问题是“我应该担心这个委托调用的性能吗?”这更容易回答,因为它是一个明确的“不,别担心”。
首先,无论一个方法调用是否得到优化器的特殊处理,单次调用的开销都可以忽略不计。真的没关系。
之所以讨论调用优化,并不是因为调用本身太昂贵,而是内联方法调用可以通过将调用者的代码和被调用者的代码作为一个单元进行分析来实现后续优化。显然,这与覆盖方法的普通代码无关。它只有在优化器要考虑调用者的上下文时才变得相关,并且如果发生这样的内联操作,那么单个委托步骤确实与优化器不匹配。这样优化的结果确实是“好像覆盖从未发生过”(这也适用于很多不那么微不足道的场景)。
但如果发生这种情况,则取决于几个周围条件,包括代码是否是与性能相关的热点的问题。如果不是,可能会发生调用未得到优化的情况,但这仍然不应该打扰你,因为,那么,它与性能无关。
所以如果我有
public void methodName() {
super.methodName();
}
编译器/JVM 将如何处理这个问题?假设签名相同,是否会像从未发生覆盖一样对待它?我想把这段代码作为意图的澄清,这样人们就不会想知道为什么 hashCode()
没有在与 equals()
如果它对系统有影响,也许不会。
好吧,通常问题是“JVM/编译器可以优化这个特定的方法调用吗?”不同于“Will it optimize said call?”,但你的实际问题是不同的。
你真正的问题是“我应该担心这个委托调用的性能吗?”这更容易回答,因为它是一个明确的“不,别担心”。
首先,无论一个方法调用是否得到优化器的特殊处理,单次调用的开销都可以忽略不计。真的没关系。
之所以讨论调用优化,并不是因为调用本身太昂贵,而是内联方法调用可以通过将调用者的代码和被调用者的代码作为一个单元进行分析来实现后续优化。显然,这与覆盖方法的普通代码无关。它只有在优化器要考虑调用者的上下文时才变得相关,并且如果发生这样的内联操作,那么单个委托步骤确实与优化器不匹配。这样优化的结果确实是“好像覆盖从未发生过”(这也适用于很多不那么微不足道的场景)。
但如果发生这种情况,则取决于几个周围条件,包括代码是否是与性能相关的热点的问题。如果不是,可能会发生调用未得到优化的情况,但这仍然不应该打扰你,因为,那么,它与性能无关。