重构会对java性能产生负面影响吗?
调用方法时会创建线程堆栈的帧,而创建堆栈帧会对java程序的性能产生负面影响。 我想知道它有多大效果 正如我所知,重构代码通常会导致将一个方法调用分离为多个方法调用,我认为这最终会导致方法调用计数的增加。 那么,使用分离方法调用进行重构的方法对要重构的java程序的性能有负面影响,这是真的吗 例如: 重构前:重构会对java性能产生负面影响吗?,java,performance,jvm,refactoring,Java,Performance,Jvm,Refactoring,调用方法时会创建线程堆栈的帧,而创建堆栈帧会对java程序的性能产生负面影响。 我想知道它有多大效果 正如我所知,重构代码通常会导致将一个方法调用分离为多个方法调用,我认为这最终会导致方法调用计数的增加。 那么,使用分离方法调用进行重构的方法对要重构的java程序的性能有负面影响,这是真的吗 例如: 重构前: public class MyClassA { public void doTask1(){ // here is very verbose code } }
public class MyClassA {
public void doTask1(){
// here is very verbose code
}
}
public class MyClassA {
public void doTask1(){
taskPart1();
taskPart2();
taskPart3();
}
public void taskPart1(){
// do something that used to be in doTask1..
}
public void taskPart2(){
// do something that used to be in doTask1..
}
public void taskPart3(){
// do something that used to be in doTask1..
}
}
重构后:
public class MyClassA {
public void doTask1(){
// here is very verbose code
}
}
public class MyClassA {
public void doTask1(){
taskPart1();
taskPart2();
taskPart3();
}
public void taskPart1(){
// do something that used to be in doTask1..
}
public void taskPart2(){
// do something that used to be in doTask1..
}
public void taskPart3(){
// do something that used to be in doTask1..
}
}
到目前为止,方法调用开销还不足以保证任何过早的优化/对性能的担忧。这显然不足以阻止您创建和调用具有良好语义的方法 此外,编译器甚至可以将它们内联
购买更好的硬件几乎总是比处理以更好的性能为名引入的bug更便宜。这是Java许多方面背后的想法(想想数组边界检查)。如果您谈论的是一般的重构,这意味着:以不同的方式(不管是什么方式)重构代码,那么这个问题就没有有意义的答案。这完全取决于具体的重构细节。方法调用确实有一些开销,但“重构”并不总是意味着会有更多的方法调用。另外,JVM内联简单的方法,因此没有方法调用开销。@SteveSmith噢,谢谢你通知我这个问题。我想我必须删除它。如果有区别的话,它甚至可以提高性能。您可能会将代码重构为单独的方法,因为a)它被多次使用,因此公共代码有更高的优化机会,这对所有调用方都有利;或者b)原始代码太大,因此重构后的代码可能会受益于JVM的优化器更适合使用较小的方法这一事实。但是单一方法的区别可能隐藏在其他因素的干扰中,我不同意。对于普通方法(尤其是getter),方法调用开销相当大。但不管在哪里,琐碎的方法都是内联的,因此开销为零尽管如此,我同意你的结论。