Best Practice Auslagerung von Code = Performance Optimierung?

L

LeNkUeP

Mitglied
Hallo zusammen,

ich habe eine sehr allgemeine Frage zu dem Thema Auslagerung von Code.
Die grundsätzliche Frage ist ob die simple Auslagerung von Codeteilen die Performance verbessert.

Der Code unserer Firma ist extrem groß und hat immer wieder die gleichen redundanten Codeblöcke (Ergebnis einer RPG-Java Migration). Nach einer sehr groben Schätzung kann ich von einem Wert jenseits von 1.5 Millionen Codezeilen ausgehen. Dabei haben manche dieser Codeblöcke eine Länge von 100 Zeilen. Manche aber auch nur 15. Die Codeblöcke arbeiten immer nach dem Prinzip: 1. Initialisierungen/Setzungen von Variablen, 2. Aufrufen von Prüfprogrammen, 3. Fehlerbehandlungen etc.
Meiner Bachelorarbeit behandelt die automatische Auslagerung dieser Codekonstrukte. Bisher kann ich ca. von 1/2 an Mindesteinsparung von Code ausgehen. So wird immerhin aus 1,5 Millionen "nur noch" 750.000.

Klar bietet das Speichervorteile doch meine Frage ist ob es auch Optimierungen bezüglich der Wartezeiten/Performance gibt/geben kann.
Ich erzeuge pro Typ dieser Codeblöcke ein Objekt. Auf diesem werden dann parametrierte Methoden aufgerufen die im Grunde das Gleiche ausführen, halt nur ausgelagert sind und so nur einmal programmiert werden müssen. Generell würde ich sagen dass es jetzt so (nicht spürbar) etwas langsamer laufen muss (wegen zusätzlicher Objektinitialisierung und Kommunikation nach außen). Doch ist es vielleicht gerade bei dieser enormen Menge auch möglich einen Performance Gewinn daraus zu ziehen?

Die Klassen und Programme welcher diese Codeblöcke verwenden sind auch um die 50.000 Zeilen groß jeweils (wenn nicht sogar noch viel größer).

Ich hoffe ich habe meine Frage gut erklärt:)
Danke für alle Antworten und Ideen.

Gruß
Lennart
 
H

httpdigest

Top Contributor
Es ist von Vorteil, kleine Methoden zu haben. Es gibt in der HotSpot JVM diverse Thresholds/Limits für das Kompilieren/Optimieren von Bytecode in nativen Code und, ob weitere Optimierungsschritte wie etwa Inlining und darauf aufbauend Espace Analysis und Scalar Replacement Anwendung finden können.
Im Vorhinein zu sagen, ob eine Optimierung etwas bringt, ist sehr schwer zu sagen. Es hängt davon ab, ob der optimierte Code "kalt", "warm" oder "heiss" ist (wie häufig wird er aufgerufen?). Dementsprechend gibt es dann auch unterschiedliche Thresholds, ob und wie der Code von der JVM bzw. dem JIT optimiert wird.
Wenn du z.B. eine Methode mit einem if-Statement hast, in dem der then-Fall wenig Code beinhaltet, aber sehr sehr häufig aufgerufen wird, und der else-Fall viel Code beinhaltet, aber sehr sehr selten bis gar nicht aufgerufen wird, dann lohnt sich auf jeden Fall eine Auslagerung des else-Falls in eine eigene Methode, damit die Methode, die das if-Statement beinhaltet, eine Chance hat, JIT-Kompiliert zu werden, wenn sie sonst zu gross wäre und der JIT sagen würde: "Neee, diese Methode probiere ich erst gar nicht zu kompilieren, sondern interpretiere sie nur".
Informiere dich also einfach mal über die diversen Thresholds und Optimierungen der von dir eingesetzten JVM.
Ich empfehle auch wärmstens, den Code mit einem guten Sampling Profiler zu profilen und auch, dir mit Hilfe von jitwatch anzuschauen, welche Optimierungen der JIT auf die einzelnen Methoden anwendet, und wenn eine Optimierung nicht angewendet wird, warum nicht.
 
Thallius

Thallius

Top Contributor
Also das Reine Entfernen von Duplikaten hat sicher Performance-Technisch keine Vorteile. Im Gegenteil: Rein technisch gesehen brauchst dann ja immer einen Methodenaufruf wo jetzt der Code direkt steht (Auch wenn das Zeittechnisch sicherlich zu vernachlässigen sein dürfte).
Der große Vorteil ist aber eben die Wartbarkeit. Wenn sich an der Initialisierung mal was ändert, dann must du es im Moment an 1000 Stellen im Code ändern. Danach nur noch an einer. Aber eben genau das kann natürlich auch gefährlich werden. Wenn du nämlich nur für einen Spezialfall eine etwas andere Initialisierung haben willst, dann fängt es wieder an: Mache ich doch eine zweite Methode dafür oder gebe ich der ersten einen weiteren Parameter? Wie viele Parameter können das dann irgendwann werden? Blickt das dann noch jemand?

Also generalisieren kann man es einfach nicht. Es kommt immer auf den expliziten Anwendungsfall an wie man sich entscheidet.

Gruß

Claus
 
H

httpdigest

Top Contributor
Also das Reine Entfernen von Duplikaten hat sicher Performance-Technisch keine Vorteile. Im Gegenteil: Rein technisch gesehen brauchst dann ja immer einen Methodenaufruf wo jetzt der Code direkt steht (Auch wenn das Zeittechnisch sicherlich zu vernachlässigen sein dürfte).
Ganz pauschal kann man das so auch nicht sagen, aufgrund der erwähnten Grenzen des JITs, was die Grösse von zu optimierendem Bytecode einer Methode angeht, bzw. der Länge des IR (Intermediate Representation) ASTs der Methode. Eine sehr grosse Methode einfach in mehrere kleinere zu zerpflücken, kann durchaus einen sehr grossen Performancegewinn ausmachen, wenn das Zerpfücken dazu geführt hat, dass die Methoden für sich gesehen klein genug sind, um ge-JIT-ted zu werden. Und Methodenaufrufe an sich gibt es in einer JVM sowieso nur noch relativ selten im aus dem Bytecode kompilierten nativen Code, da sehr sehr viel bereits optimistisch mit type-guards ge-inline-d wird (wenn es die Methodengrösse und die Aufruftiefe zulässt), wenn es sich um monomorphe oder bimorphe Aufrufe handelt, oder ohne Guards, wenn es sich um private oder statische Methodenaufrufe handelt.

Bei deiner Argumentation bezüglich Wartbarkeit bin ich allerdings absolut deiner Meinung!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Auslagerung von verschachtelten Schleifen Allgemeine Java-Themen 11
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen ​ Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
M Code optimieren Allgemeine Java-Themen 7
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Erzeugung von Java-Code Allgemeine Java-Themen 2
A Source code analyze Allgemeine Java-Themen 8
N VB Code in Java verwenden Allgemeine Java-Themen 5
P Aktuellen HTML Code auslesen (von JS manipuliert) Allgemeine Java-Themen 3
M HTML-Code von Webseite über Browser oder Console auslesen?? Allgemeine Java-Themen 5
S QR-Code generator Allgemeine Java-Themen 2
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
DaniSahne96 Threads Code funktioniert nicht wie er sollte Allgemeine Java-Themen 9
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
J Code ausführen bei JVM-Zerstörung Allgemeine Java-Themen 15
P HTTP Falscher Code per url.openStream() Allgemeine Java-Themen 4
P Code in Methode auslagern möglich? Allgemeine Java-Themen 9
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
L php code in java ausführbar? Allgemeine Java-Themen 6
S Access Restrictions in Eclipse auf Code beschraenken (und nicht fuer Comments) Allgemeine Java-Themen 2
D Fehler im Java Code Allgemeine Java-Themen 22
Gossi Java Code in einer GUI eingeben und ausführen? Allgemeine Java-Themen 2
D Code später ausführen Allgemeine Java-Themen 8
J Code aufräumen Allgemeine Java-Themen 9
P JAVA Code in Dokumentation erklären Allgemeine Java-Themen 2
B Verwendung von Packages im Java Code Allgemeine Java-Themen 10
S Wie reicht man am Besten Zahlenwerte von der GUI zum Code, der damit arbeitet? Allgemeine Java-Themen 10
R Was führt dieser Code aus Allgemeine Java-Themen 3
J Explorer über Code starten Allgemeine Java-Themen 15
K htmlCode einlesen, Speicherüberlauf? zu viel code? Allgemeine Java-Themen 21
J String filtern / XML-Code extrahieren Allgemeine Java-Themen 4
D ineffizienter Code Allgemeine Java-Themen 8

Ähnliche Java Themen

Anzeige


Oben