Frage

In C ++ kann ich eine Methode „inline“ deklarieren und der Compiler ist wahrscheinlich, es inline. Soweit ich es verstehe, ist kein solches Schlüsselwort in Java.

Inlining erfolgt, wenn die JVM, dies zu tun entscheidet? Kann ich diese Entscheidung beeinflussen irgendwie?

War es hilfreich?

Lösung

Ein paar der anderen Antworten haben vorgeschlagen, dass nur endgültige Methoden inlined werden kann - das ist nicht wahr, wie HotSpot intelligent genug, um in der Lage sein, lange Inline-nicht-final-Methoden, um sie nicht außer Kraft gesetzt wurden, noch . Wenn eine Klasse geladen wird, der die Methode überschreibt, kann es seine Optimierung rückgängig machen. Offensichtlich macht das Verfahren endgültig Mittel, die nie erforderlich ist ...

Im Grunde lassen die JVM seine Arbeit zu tun - es ist wahrscheinlich viel besser an, herauszufinden, wo Inline als Sie

sein.

Haben Sie eine Situation, wo Sie überzeugt sind, dass die JVM nicht einen guten Job machen? Angenommen, Sie sind mit HotSpot, haben Sie versucht, die Server-Version anstelle von Client? Das kann machen eine großen Unterschied.

Andere Tipps

Obwohl die Java-Compiler Inline tun können (kurz früh gebundenen Methoden) die real inlining wird durch die JIT-Compiler erfolgen. Der JIT (HotSpot) Compiler in der Lage, auch, Inline virtuelle Methoden. Der beste Weg, um mit ihr zu interagieren ist ein einfachen und präzisen Code zu schreiben. Höchstwahrscheinlich Code, der Reflexion verwendet wird nicht für inlining ermöglichen.

Ich hoffe, das hilft.

'In C ++ kann ich eine Methode "inline" deklarieren und die Compiler inline es ... oder nicht. Der Compiler ist frei, die Funktion inline oder nicht zu machen, und Sie können das Ergebnis nicht wirklich beeinflussen. Es ist nur ein Hinweis an den Compiler.

In Java gibt es keine solche Sache, der Compiler (und später die VM während der Durchführung Optimierungen) auf ‚inline‘ entscheiden können, die Methode.

Beachten Sie, dass final Methoden haben größere Chancen auf (die Compiler Inline nicht endgültige Methoden kann nicht, da sie in abgeleiteten Klassen überschrieben werden können) inlined werden. Mit modernem VM kann eine ähnliche Optimierung zur Laufzeit vorgenommen werden. Die VM wird Flagge den Typ (so kann es Typprüfungen durchführen) und den Code inline wird. Nur wenn die Überprüfung fehlschlägt, wird es wieder in den ursprünglichen unoptimized polymorphen Methodenaufruf fallen.

Inlining ist wahrscheinlicher, wenn das betreffende Verfahren geschehen ist:

  • kurz
  • letzte
  • nicht abhängig von irgendwelchen lange, nicht abschließenden Methoden

Wie diese sind die einzigen Umstände, unter denen die JVM bestimmen die Auswirkungen des Anrufs sein können.

class A {
    final int foo() { return 3; }
}

Mit dieser Klasse gegeben, jeden Anruf auf foo () mit der Konstante „3“ ersetzt. Jede Java1 virtuelle Maschine kann dies tun, weil das letzte Schlüsselwort explizit vorschreibt, dass es nicht möglich ist, eine Unterklasse zu haben, die „int foo ()“ außer Kraft setzt.

Inlining das Verfahren die folgenden Vorteile auf Aufrufort sieht vor:

  • Kein Methodenaufruf
  • Keine dynamische Dispatch
  • Mögliche zu Konstant-fache des Wertes, z. B. "A.foo () + 2" wird 5 ohne Code auf
    ausgeführt Laufzeit.

In der Vergangenheit oft Programmierer eingesetzt, um das letzte Stichwort genau diesen Grund . Oder besser inlining zu erleichtern und die Ausführungsgeschwindigkeit erhöhen, würden sie viele kleinere Methoden zu einem größeren Verfahren kombinieren. Aber in vielerlei Hinsicht, solche Techniken die gesamte Anlage der Modularisierung besiegen und Wiederverwertbarkeit in die Programmiersprache gebaut.

Moderne JVM, wie die Java HotSpot VM Lage ist, die Klasse ohne die letzte Inline. Stichwort **.

( http://java.sun.com/developer/ technicalArticles / Networking / HotSpot / inlining.html )

Lesen Sie dies für Inlining Verhalten. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html

Es sagt Schluss Methoden inlined werden können, aber nicht immer.

Ja, wenn die JVM, es zu tun entscheidet, es kann. Wege zu beeinflussen, gehören die Methode als statische oder als endgültige Einstellung.

Natürlich ist das Wichtigste daran ist, dass die Struktur der Inline-freundlich sein muss. Kurze hilft, vor allem aber braucht es nur seine lokalen Variablen und deren Parameter zu verwenden, keine Felder und minimale Methode ruft zu anderen Methoden in der gleichen Klasse.

Allerdings sollten Sie nicht solche Optimierungen vorzeitig tun aussehen, könnten Sie tatsächlich werden die Dinge schlimmer (weil Sie Kurzschließen andere mögliche Optimierungen sein könnte). Die JVM wird manchmal erkennen, dass ein Verfahren auch ohne diese Hinweise inlined werden.

Wenn Sie eine normale Funktion und letzte Funktion zu vergleichen (die angeblich Inline durch JVM sein), habe ich gesehen, dass es keine Leistungsverbesserung zwischen ihnen. Vielleicht Anruf Overhead-Funktion ist bereits sehr niedrig.

. Hinweis: Ich benutzte Box Algorithmus Verwischung für die Leistungsbewertung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top