Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重构会对java性能产生负面影响吗?_Java_Performance_Jvm_Refactoring - Fatal编程技术网

重构会对java性能产生负面影响吗?

重构会对java性能产生负面影响吗?,java,performance,jvm,refactoring,Java,Performance,Jvm,Refactoring,调用方法时会创建线程堆栈的帧,而创建堆栈帧会对java程序的性能产生负面影响。 我想知道它有多大效果 正如我所知,重构代码通常会导致将一个方法调用分离为多个方法调用,我认为这最终会导致方法调用计数的增加。 那么,使用分离方法调用进行重构的方法对要重构的java程序的性能有负面影响,这是真的吗 例如: 重构前: public class MyClassA { public void doTask1(){ // here is very verbose code } }

调用方法时会创建线程堆栈的帧,而创建堆栈帧会对java程序的性能产生负面影响。 我想知道它有多大效果

正如我所知,重构代码通常会导致将一个方法调用分离为多个方法调用,我认为这最终会导致方法调用计数的增加。 那么,使用分离方法调用进行重构的方法对要重构的java程序的性能有负面影响,这是真的吗

例如:

重构前:

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),方法调用开销相当大。但不管在哪里,琐碎的方法都是内联的,因此开销为零尽管如此,我同意你的结论。