Domanda

In C++ posso dichiarare un metodo "inline" ed è probabile che il compilatore lo inlinei.Per quanto ho capito, non esiste una parola chiave simile in Java.

L'inlining viene eseguito se la JVM decide di farlo?Posso influenzare questa decisione in qualche modo?

È stato utile?

Soluzione

Un paio di altre risposte hanno suggerito che solo i metodi finali possono essere inline - questo non è vero, come HotSpot è abbastanza intelligente da essere in grado di riga non-finale metodi fintanto che non siano stati sovrascritti ancora . Quando una classe viene caricata, che ridefinisce il metodo, può annullare la sua ottimizzazione. Ovviamente facendo la media finale metodo che non ha mai richiesto ...

In pratica lasciare che la JVM fare il suo lavoro - è probabile che sia molto meglio a lavorare fuori dove inline di te

.

Avete una situazione in cui sei convinto che la JVM non sta facendo un buon lavoro? Supponendo che si sta utilizzando HotSpot, hai provato ad utilizzare la versione server, invece di cliente? Che può fare un enorme differenza.

Altri suggerimenti

Anche se il compilatore Java può fare in linea (per brevi metodi ad associazione anticipata) il reale inline sarà fatto dal compilatore JIT. Il JIT (HotSpot) compilatore sarà in grado di, anche, in linea virtuali metodi. Il modo migliore per interagire con esso è quello di scrivere un codice semplice e concisa. Molto probabilmente, il codice che utilizza la riflessione non permetterà per la messa in linea.

La speranza che aiuta.

'In C ++ posso dichiarare un metodo "in linea" e il compilatore inline è' ... oppure no. Il compilatore è libero di fare la funzione inline o meno e non si può davvero influenzare il risultato. E 'solo un suggerimento per il compilatore.

In Java non c'è nulla di simile, il compilatore (e più tardi la VM, mentre le ottimizzazioni dello spettacolo) possono decidere di 'inline' il metodo.

Nota che finale metodi hanno maggiori probabilità di essere sia allineata (il compilatore non può inline metodi non-finale, in quanto possono essere sovrascritti in classi derivate). Con VM moderno, un'ottimizzazione analoga può essere fatta in fase di esecuzione. La VM contrassegnerà il tipo (in modo che possa effettuare i controlli di tipo) e sarà inline il codice. Solo se il controllo ha esito negativo, cadrà nuovamente dentro la chiamata di metodo polimorfico non ottimizzata originale.

Inlining è più probabile che accada se il metodo in questione è:

  • breve
  • finale
  • non dipende da alcun metodo finali lunghe, non

Per quanto queste sono le uniche circostanze in cui la JVM può essere certo degli effetti della chiamata.

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

Data questa classe, qualsiasi chiamata a foo() può essere sostituita con la costante "3".Qualsiasi macchina virtuale Java1 può farlo, perché il file finale La parola chiave indica esplicitamente che non è possibile avere una sottoclasse che sovrascriva "int foo()".

L'incorporamento del metodo offre i seguenti vantaggi sul sito della chiamata:

  • Nessuna chiamata al metodo
  • Nessun invio dinamico
  • È possibile piegare costantemente il valore, ad es."a.foo()+2" diventa 5 senza codice eseguito
    tempo di esecuzione.

In passato, i programmatori spesso inserirono il file finale parola chiave esattamente per questo motivo.Oppure, per facilitare meglio l'incorporamento e aumentare la velocità di esecuzione, combinerebbero molti metodi più piccoli in un metodo più grande.Ma in molti modi, tali tecniche vanificano l’intera struttura di modularizzazione e riusabilità insita nel linguaggio di programmazione.

La JVM moderna, come Java HotSpot VM, è in grado di incorporare la classe senza il file finale.parola chiave**.

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

Leggi questo per comportamento Inlining. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html

Si dice metodi finali possono essere inline, ma non sempre.

Sì, se la JVM decide di farlo, si può. Modi per influenzare includono l'impostazione del metodo statico o come finale.

Naturalmente, la cosa più importante a questo proposito è che la struttura del metodo deve essere in linea amichevole. Breve aiuta, ma soprattutto ha la necessità di utilizzare solo le sue variabili locali e suoi parametri, nessun campo, e il metodo minimo le chiamate ad altri metodi nella stessa classe.

Tuttavia non si deve cercare di fare queste ottimizzazioni prematuramente, si potrebbe effettivamente essere facendo peggiorare le cose (perché si potrebbe essere in cortocircuito altre ottimizzazioni potenziali). La JVM a volte rendersi conto che un metodo può essere inline, senza questi suggerimenti.

Quando si confrontano una funzione normale e la funzione finale (che si dice essere ancorato JVM), ho visto che non v'è alcun miglioramento di prestazioni tra loro. Forse sovraccarico di chiamata di funzione è già molto basso.

. Nota: scatola di sfocatura algoritmo per la valutazione delle prestazioni che ho usato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top