Lösung
Wenn ein gegebenes Stück Code ausgeführt wird, wenn Sie eine Standardfunktion ist die Ausführungszeit nennen höher leicht als Dumping den Code dort in diese Funktion enthält. jedes Mal, dumping der gesamte Code in einer Funktion enthalten ist, am anderen Ende unmainteinable, weil es offensichtlich ein ganzes Durcheinander von Doppel Code führt.
Inlining löst die Performance und Wartbarkeit Problem, indem sie die Funktion als deklarierst inline (zumindest in C ++), so dass, wenn Sie rufen diese Funktion - anstelle von Ihre App Springen zur Laufzeit um -. der Code in der Inline-Funktion eingespritzt werden, aufgerufen wird jedes Mal bei der Kompilierung der gegebene Funktion
Kehrseite der Medaille ist, dass - wenn Sie Inline große Funktionen, die Sie eine Menge Zeit nennen - die Größe des Programms erheblich erhöhen ( Best Practices vorschlagen, es zu tun nur auf kleine Funktionen in der Tat) .
Andere Tipps
http://en.wikipedia.org/wiki/Inlining
Bei der Berechnung, Inline-Erweiterung oder inlining, ist eine Compiler-Optimierung, die eine Funktion Aufrufstelle mit dem Körper des Angerufenen ersetzt. Diese Optimierung kann Zeit und Raumnutzung zur Laufzeit, bei den möglich Kosten für die Erhöhung der Größe des endgültigen Programms verbessern.
Als Java-Entwickler, Sie haben in der Regel nicht zu befürchten Methode inlining. Java Just-in-Time-Compiler kann und es automatisch in den meisten Orten tun, wo es Sinn macht.
IDEs wie Eclipse kann eine Funktion haben, die Sie Methoden auf Quellcode-Ebene Inline erlaubt - nie tun dies für die Leistung, nur für die Lesbarkeit des Codes (zB wenn man bedenkt, dass das Verfahren nur nennt man andere Verfahren ohne nützlich selbst) etwas hinzuzufügen.
Norman Maurer , erklärt in seinem Eva Andreasson 's Java Welt Geben Sie . Sie können unter dem zugehörigen Teil der Post finden.
versuchen Viele Optimierungen Maschine-Level-Sprungbefehle (zum Beispiel JMP für x86-Architekturen) zu beseitigen. Ein Sprungbefehl ändert die Befehlszeigerregister und dadurch überträgt den Ausführungsablauf. Dies ist eine teure Operation relativ zu anderen Montageanleitung, weshalb es sich um ein gemeinsames Ziel zu verringern oder zu beseitigen. Ein sehr nützliche und bekannte Optimierung, dass die Ziele dieser genannt wird inlining. Da Springen teuer sind, kann es hilfreich sein, viele häufigen Anrufe zu kleinen Methoden Inline, mit verschiedenen Eingabeadressen, in die anrufende Funktion. Der Java-Code in Anzeigen 3 bis 5 ein Beispiel für die Vorteile von inlining.
Listing 3. Caller Methode
int whenToEvaluateZing(int y) {
return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}
Listing 4. Called Methode
int daysLeft(int x){
if (x == 0)
return 0;
else
return x - 1;
}
Listing 5. Inlined Methode
int whenToEvaluateZing(int y){
int temp = 0;
if(y == 0) temp += 0; else temp += y - 1;
if(0 == 0) temp += 0; else temp += 0 - 1;
if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;
return temp;
}
In Listings 3 bis 5 der anrufende Methode macht drei Anrufe ein kleine Methode, die wir für dieses Beispiel willen mehr davon ausgehen, vorteilhaft Inline als zu springen zu dreimal.
Es ist vielleicht nicht viel Unterschied machen, ein Verfahren zur Inline, die aufgerufen wird selten, aber inlining eine so genannte „hot“ Methode, die häufig ist genannt einen großen Unterschied in der Leistung bedeuten könnte. inlining auch wie oft macht Weg für weitere Optimierungen, 6 in Listing.
Listing 6. Nach inlining können mehr Optimierungen angewendet werden
int whenToEvaluateZing(int y){
if(y == 0) return y;
else if (y == -1) return y - 1;
else return y + y - 1;
}
Wie bereits in anderen Antworten erwähnt, inlining kommt mit einem Preis. In der Regel wird dies als klein, aber wenn tatsächlich messen Sie überrascht sein könnte und lernen, dass es sein könnte, größer als das, was Sie gewinnen (so , was andere Leute sagen gilt:. nicht optimize es sei denn, Sie haben gemessen)
Es ist erwähnenswert, dass in der Linux-Kernel begannen sie un-inlining ursprünglich inlined Funktionen vor einiger Zeit, weil die Kosten zu hoch waren (größere Funktionen mehr von der CPU-Cache-Speicher verbraucht, und das daraus resultierende Cache-Misses waren teurer als nur Aufruf der Funktion, die) werden inlined wurden sollen. Siehe "Kapitel 15: Die Inline-Krankheit" in doc / Dokumentation / Prozess / Codierung-style.rst für weitere Details.
Im Grunde genommen in C / C ++, kann der Compiler Funktionen inline, das heißt, anstatt einen Funktionsaufruf zu machen, dass die Operation zu tun, wird der Code zum Aufruf Funktion des Blocks hinzugefügt werden, so wird es als sein, obwohl es nie hatte war ein separater Funktionsaufruf.
Dies wird mehr ins Detail gehen: http://www.codersource.net/cpp_tutorial_inline_functions.html
Inlining bezeichnet Zeit kompiliert Optimierung, wo eine kleine Funktion des Code wird in die aufrufende Funktion injiziert werden, anstatt einen separaten Aufruf erforderlich.
Die Compiler-Optimierung Antworten sind richtig. Es gibt eine andere Nutzung, obwohl - in Refactoring , inlining bezieht sich einen Methodenaufruf mit dem Körper zu ersetzen das Verfahren und das anschließende Entfernen des Verfahrens. Siehe Inline-Methode . Es gibt ähnliches Refactoring, wie Inline Klasse .
EDIT: Beachten Sie, dass Refactoring manuell durchgeführt wird oder mit einem Werkzeug; In beiden Fällen geht es um den Quellcode zu verändern.
Inline-Funktionen werden in der Regel in C ++ Header-Dateien nicht Java verwendet. Ein C ++ Header-Datei in der Regel enthält Code nicht implementiert und ist eine Schnittstelle zu der CPP-Datei mit dem gleichen Namen betrachtet, die in der Regel den implementierten Code enthält. Es ist legal, eine Inline-Funktion in einer Header-Datei, in der Regel eine kleine, leichte Funktion aufzunehmen. Inline-Funktionen zu einem Preis kommen, so dass sie keine großen speicherintensiven Operationen sein sollten. Für kleine Routinen sind die Performance-Einbußen minimal, und sie sind mehr Einfachheit halber verwendet.
In dieser Diskussion Jon Skeet erwähnt Client-JVM (Hotspot) v Server Jvm mit den Leistungsverbesserungen zur Verfügung zu Laufzeit, wenn der JIT (Just-in-Time) Compiler zu bringen zeitbasierte Erweiterungen erlaubt. Das ist „wie es gemacht wird“ in Java.
Ursprünglich kleine Abschnitte des Codes, die nicht von vielen Orten genannt wurden würden „inlined“ durch den Compiler, was bedeutet, dass das, was ein Singleton direkt in dem Befehlszeiger Codepfad platziert werden würde genannt wurde, dabei eine Funktion Zweig und Rücksendekosten mehr Prozessorleistung als nur eine Schleife oder Funktionsaufruf Abrollen und die Anweisungen „genau dort“
platzierenHeute Singleton ist das Thema von mehreren Seiten Diskussionen und Loop-Abrollen sowie etwas wie inlining sind etwas entfernt von ihrem ursprünglichen Kontext (n). Sie können Dov Bulka ist sehr informiert Arbeit über die Angelegenheit lesen Sie die C / C ++ zu bekommen auf der Angelegenheit. Für Java-Studie davon ist reich lib ist in java.util würde Ihre Bedürfnisse besser als Studie von inlining und tiefen Compiler Fragen dienen - Sie verschanzt umkämpfte intra-Kriegsführung auf Datenstrukturen, über Anrufe in 16-Bit-Code, der Glanz gehängt bekommen können, und geht kein Ende auf Ihrer Lernkurve.
Sie kann tun instanceof in Java, das eine vf-Tabelle ähnelt (keine Wärme Leute, bitte), aber denken Sie daran, wie Sie in einer stark typisierte Sprache geschrieben haben - und wird nun in einer Sprache zu schreiben, in dem String Ausreißer kann leicht stochert, wo sie nichts zu suchen haben. Ich habe versucht, vor kurzem zu schreiben Code, der ein Bild in Java aufgebaut, tut das aus C-Code. Ich fand ich bald für eine starke Verschlüsselung bei der OXR Tabelle suchen - die nichts mit dem Code zu tun hat, ich schreibe.
Wie würden Sie eine String-Klasse in C / C ++ schreiben, die einen kleinen Puffer für Strings unter 32 Bytes und Fallen Zeiger haben, so dass sie nur auf der Saite arbeiten?
Nicht versuchen, Sie oder etwas zu necken, es ist nur ein wirklich guter Anfang, anstatt inlining und Compiler Wissenschaft.