2017-01-26 3 views
0

Ein Frame eines Thread-Stacks wird erstellt, wenn eine Methode aufgerufen wird, und das Erstellen von Stack-Frames wirkt sich negativ auf die Leistung eines Java-Programms aus. Ich möchte wissen, wie viel Wirkung es ist?Kann das Refactoring negative Auswirkungen auf die Java-Performance haben?

Wie ich weiß, Refactoring-Codes führt oft dazu, einen Methodenaufruf in mehr als einen Methodenaufruf zu trennen, und ich denke, es führt am Ende zu Inkrement-Methodenaufruf zählen. Stimmt es also, dass die Refactoring-Methoden mit Trennmethodenaufrufen negative Auswirkungen auf die Leistung von zu refaktorierenden Java-Programmen haben?

Zum Beispiel:

Vor Überarbeitete:

public class MyClassA { 
    public void doTask1(){ 
     // here is very verbose code 
    } 
} 

Nach Refactoring:

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.. 
    } 
} 
+1

Wenn Sie über Refactoring im Allgemeinen sprechen, was bedeutet: Umstrukturierung des Codes auf eine andere Art und Weise (was auch immer das sein mag), dann hat diese Frage keine sinnvolle Antwort. Es hängt vollständig von den Details ab, wie genau Sie es umgestalten. Methodenaufrufe haben einen gewissen Overhead, aber "Refactoring" bedeutet nicht immer, dass es mehr Methodenaufrufe gibt. Außerdem inliniert die JVM einfache Methoden, sodass es keinen Methodenaufruf-Overhead gibt. – Jesper

+0

@SteveSmith Oh, danke, dass du mich über diese Frage informiert hast. Ich denke, ich muss es löschen. – ParkCheolu

+0

Es könnte sogar * die Leistung * verbessern, wenn es überhaupt einen Unterschied gibt. Sie transformieren Code wahrscheinlich in separate Methoden, weil a) er mehrfach verwendet wird, sodass der allgemeine Code eine höhere Wahrscheinlichkeit hat, zum Nutzen aller Aufrufer optimiert zu werden, oder b) der ursprüngliche Code zu groß war, sodass der umgestaltete Code davon profitieren könnte aus der Tatsache, dass der JVM-Optimierer mit kleineren Methoden besser ist. Aber der Unterschied für eine einzige Methode ist wahrscheinlich im Rauschen anderer Faktoren verborgen. – Holger

Antwort

2

Das Kopfmethodenaufruf ist bei weitem nicht signifikant genug, um keine vorzeitigen Optimierung/Sorgen zu rechtfertigen über die Leistung. Es ist definitiv nicht signifikant genug, um zu verhindern, dass Sie Methoden erstellen und aufrufen, die eine gute semantische Bedeutung haben.

Plus könnte der Compiler sogar inline sie.

Kauf besser Hardware ist fast immer billiger dann mit Bugs im Namen der besseren Leistung. Dies ist eine Idee hinter vielen Aspekten von Java (denke an die Überprüfung der Array-Grenzen).

+0

Ich stimme eher nicht zu. Der Methodenaufruf-Overhead ist ziemlich groß für triviale Methoden (insbesondere Getter). Aber wo immer es darauf ankommt, wird die triviale Methode inline, so dass es keinen Overhead gibt. +++ Das stimmt, ich stimme Ihrer Schlussfolgerung zu. – maaartinus

Verwandte Themen