Questa è una domanda in due parti, ma non avrebbe senso per i singoli pezzi. Un gran numero di istruzioni dup
all'interno del bytecode emette un indicatore di codice scritto male? Dove grande è definito da una percentuale di tutte le istruzioni bytecode. Inoltre, come si fa a riscrivere il codice che genera un'istruzione dup
?Bytecode Java "eccessivo" numero di codice "povero" dup considerato?
risposta
stiamo parlando javac
uscita si sta analizzando o il proprio compilatore/generatore? Se sei preoccupato della qualità del tuo codice Java dal punto di vista di ciò che produce javac
, dimenticalo. Prima di tutto javac
produce un bytecode subottimale e fa affidamento su JVM/JIT per fare tutte le ottimizzazioni (scelta molto buona). Ma ancora il bytecode è probabilmente molto meglio di qualsiasi cosa si possa inventare rapidamente. È simile alla domanda sulla qualità del codice assembly generato dal compilatore C.
Se si sta generando bytecode te stesso, il numero eccessivo di dup
può sembrare cattivo, ma così non potrebbe avere alcun impatto sulle prestazioni. Ricorda che il bytecode viene tradotto all'assemblaggio sul computer di destinazione. JVM è una macchina stack, ma la maggior parte delle architetture in questi giorni sono basate su registri. Il fatto che si usi dup
è solo perché alcune istruzioni bytecode sono distruttive (valore pop dallo stack degli operandi durante la lettura). Questo non succede con i registri: puoi leggerli tutte le volte che vuoi. Prendere il seguente codice come un esempio:
new java/lang/Object
dup
invokespecial java/lang/Object <init>()V
dup
deve essere utilizzato qui perché invokespecial
pops cima alla pila operando. Creare un oggetto solo per perdere un riferimento ad esso dopo aver chiamato il costruttore suona come una cattiva idea. Ma nell'assemblaggio non c'è il dup
, nessuna copia e duplicazione dei dati. Avrai solo un registro CPU singolo che punta a java/lang/Object
.
In altre parole, il bytecode subottimale è tradotto in assemblaggio "più ottimale" al volo. Solo ... non preoccuparti.
Hmm, hai alcune risorse che indicano perché? Ho fatto la mia giusta parte di ricerche e sembra che la comprensione del set di istruzioni bytecode sia fondamentale per capire cosa fa il programma in fase di runtime. Se riesco a trovare la tesi che lo chiama, lo posterò come link. – Woot4Moo
@ Woot4Moo: che tipo di risorse stai chiedendo? Sono d'accordo che la comprensione del bytecode è molto importante. Sto solo dicendo che 'dup' potrebbe non attivare realmente l'istruzione della singola CPU.È solo un'astrazione che andrà via durante la compilazione JIT. –
Questo è il tipo di risorsa che sto cercando. Dove prova o almeno allude in alcuni casi che il JIT lo butta via. E accetterò una risposta della grande specifica bytecode se è effettivamente dove risiede. – Woot4Moo
L'istruzione dup
duplica semplicemente l'elemento in cima alla pila operando. Se il compilatore sa che sta per usare un valore più volte in un intervallo relativamente breve, può scegliere di duplicare il valore e tenerlo sulla pila degli operandi fino a quando non è necessario.
Uno dei casi più comuni in cui si vede dup
è quando si crea un oggetto e conservarla in una variabile:
Foo foo = new Foo();
esecuzione javap -c
, si ottiene la seguente bytecode:
0: new #1; //class Foo
3: dup
4: invokespecial #23; //Method "<init>":()V
7: astore_1
In inglese: l'operazione new
crea una nuova istanza dell'oggetto e il invokespecial
esegue il costruttore . Dal momento che è necessario il riferimento sullo stack per richiamare il costruttore e anche per memorizzare nella variabile, ha molto senso utilizzare dup
(soprattutto perché l'alternativa, l'archiviazione nella variabile e quindi il recupero per eseguire il ctor, potrebbe violare il Modello di memoria Java).
Ecco un caso in cui dove Oracle Java Compiler (1.6) no uso dup
quando mi aspetterei a:
int x = 12;
public int bar(int z)
{
int y = x + x * 3;
return y + z;
}
mi aspetto al compilatore di dup
il valore di x
, dal momento che appare più volte nell'espressione. Invece, itemitted codice che più volte caricato il valore dall'oggetto:
0: aload_0
1: getfield #12; //Field x:I
4: aload_0
5: getfield #12; //Field x:I
8: iconst_3
9: imul
10: iadd
mi sarei aspettato il dup
perché è relativamente costoso per recuperare un valore da un oggetto (anche dopo Hotspot fa la sua magia), mentre le due cellule pila è probabile che si trovino sulla stessa riga della cache.
e il motivo per cui è più economico? – Woot4Moo
"mentre due pile di stack sono probabilmente sulla stessa linea della cache" – parsifal
Anche se, per quel che ne so, Hotspot riconosce le chiamate duplicate 'getfield', riconosce che l'oggetto non è" volatile "e memorizza il valore del campo in una Registrare. – parsifal
Se sei preoccupato per l'impatto di dup
e le sue relazioni sulle prestazioni, non preoccuparti. La JVM esegue la compilazione just in time, quindi non dovrebbe fare alcuna differenza nelle prestazioni.
Per quanto riguarda la qualità del codice, vi sono due fattori principali che causeranno la generazione di istruzioni dup
da parte di Javac. Il primo è l'istanziazione di oggetti, dove è inevitabile. Il secondo è determinati usi dei valori immediati nelle espressioni. Se ne vedi molti più tardi, potrebbe essere un codice di scarsa qualità, dal momento che di solito non desideri espressioni complicate come quelle del tuo codice sorgente (è meno leggibile).
Le altre versioni di dup
(dup_x1
, dup_x2
, dup2
, dup2_x1
, e dup2_x2
) sono particolarmente problematico in quanto istanze di oggetti non usa quelle, quindi significa quasi certamente il più tardi. Ovviamente anche allora non è un grosso problema. Tutto ciò significa che il codice sorgente non è leggibile come potrebbe essere.
Se il codice non è compilato da Java, tutte le scommesse sono disattivate. La presenza o l'assenza di istruzioni non ti dice molto, specialmente nelle lingue i cui compilatori eseguono l'ottimizzazione del tempo di compilazione.
- 1. Perché il seguente codice si traduce in una nuova istruzione + dup op in bytecode java?
- 2. Informazioni su codice bytecode Java e JVM
- 3. Marshal.SizeOf struttura restituisce eccessivo numero
- 4. Lettura di un'istruzione bytecode Java: cosa significa il numero?
- 5. editor bytecode java?
- 6. E 'possibile visualizzare un codice di classe Java bytecode
- 7. Archetype Maven: genera un numero eccessivo di scelta
- 8. Comportamento diverso di bytecode java
- 9. Analisi bytecode in Java
- 10. Cos'è l'iniezione bytecode Java?
- 11. Differenze nel bytecode java prodotto dai compilatori Oracle ed Eclipse
- 12. variabili locali in bytecode Java
- 13. Apri controller di visualizzazione a livello di codice e non utilizza un numero eccessivo
- 14. Alternative alla strumentazione bytecode Java
- 15. Compilare a bytecode java (senza utilizzare Java)
- 16. Come convertire il codice ByteCode in codice macchina
- 17. bytecode Java: tipi di variabili locali?
- 18. È possibile trasformare il bytecode LLVM in bytecode Java?
- 19. Ottimizzazione del compilatore: bytecode Java
- 20. Compilatore bytecode Java in JavaScript
- 21. Suggerimenti libreria manipolazione Bytecode Java
- 22. Perché questo array Java è considerato bidimensionale?
- 23. Rubino DUP/clone ricorsivamente
- 24. Perché creare DUP quando si crea una nuova istanza
- 25. in esecuzione bytecode jython utilizzando java
- 26. equivalenti bytecode Java per ilasm/ildasm
- 27. Cosa significa `dup (?)` In TASM?
- 28. I valori predefiniti dell'annotazione Java vengono compilati in bytecode?
- 29. L'utilizzo di DataTable è eccessivo?
- 30. come è rappresentato l'annotazione java in java bytecode
Per curiosità, cosa provocherebbe una simile domanda? – delnan
Suppongo che tu abbia controllato i collegamenti a destra: http://stackoverflow.com/questions/8594657/why-does-the-following-code-translate-to-a-newew-dup-op-instructions-in- java-byt e http://stackoverflow.com/questions/12438567/java-bytecode-dup – assylias
@assylias sì, certo. Tuttavia, non rispondono alle mie domande specifiche. – Woot4Moo