2012-11-28 8 views
8

den folgenden Code Gegeben:Warum javac optimiert nicht einmal einfachen Code?

public class MainClass { 
    public static int f(){ 
     int i=0; 
     i++; 
     return i; 
    } 
} 

der javac-Compiler erzeugt den folgenden Code:

Compiled from "MainClass.java" 
public class latte_jvm.MainClass { 

    public static int f(); 
    Code: 
     0: iconst_0 
     1: istore_0 
     2: iinc   0, 1 
     5: iload_0 
     6: ireturn 
} 

Funktion f ist wirklich einfache Sache - es 1. nur Returns es so direkt übersetzt, dass es mir schwer macht, zu glauben, dass der Java-Compiler überhaupt Optimierungen vornimmt. Warum haben sich Java-Compiler-Ersteller entschieden, solche Optimierungen in der Kompilierungsphase nicht zu machen?

+4

Der Compiler ist nicht der einzige Optimierer. Der JIT-Compiler kann sie später optimieren. – reprogrammer

+2

Ich denke, die meisten Optimierungen werden zur Laufzeit vom JIT durchgeführt. – Mysticial

Antwort

17

Ist so direkt übersetzt, dass es mir schwer fällt zu glauben, dass Java Compiler überhaupt irgendwelche Optimierungen macht.

In der Tat. Die meisten Java-Optimierungen werden stattdessen zur JIT-Zeit durchgeführt. Die Java-Betreuer haben vor einiger Zeit herausgefunden, dass Optimierungen bei Kompilierungszeit in vielen Fällen tatsächlich wichtigere Optimierungen zur JIT-Zeit verhindert haben.

Seit einigen Jahren hat das Befehlszeilenargument -O nichts getan - und das ganz bewusst so.

+0

Aber immer noch, könnte es nicht einfach 'iconst_1; irreturn? – Marcin

+2

@Marcin Es könnte, aber das würde Aufwand erfordern, und das JIT tut es schon. – delnan

+2

+1 IMHO, die wenigen Optimierungen, die der 'Javac' tut, kann genauso ein Fluch wie ein Segen sein. z.B. Inlining Kompilierzeit Konstanten. –

6

Durch die Umstellung der Optimierung auf JVM können auch alle JVM-basierten Sprachen profitieren. Compiler (nicht nur Javac) haben eine relativ einfachere Arbeit; Spracherfinder müssen keine Optimierungsexperten sein.