2015-05-22 24 views
9

Ho deciso di verificare la perspicacia di Java Compiler; quindi, ho scritto una classe semplice.Strana ottimizzazione delle condizioni "if" in Java

public class Foo { 
    public Foo(boolean a, int b) { 
     if (a == true && a != false) { 
      b = 1; 
     } 
    } 
} 

mi chiedevo se il compilatore di ottimizzare la condizione per qualcosa di più semplice come:

if (a == true) {} 

ho compilato la classe e poi smontato con lo strumento javap. Quando ho dato un'occhiata all'output, ero davvero sbalordito, perché il compilatore verifica entrambe le condizioni, ciò che è chiaramente mostrato di seguito.

Compiled from "Foo.java" 
public class Foo { 
    public Foo(boolean, int); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: iload_1 
     5: iconst_1 
     6: if_icmpne  15 
     9: iload_1 
     10: ifeq   15 
     13: iconst_1 
     14: istore_2 
     15: return 
} 

Sono solo curioso, perché è l'esecuzione di istruzioni ridondanti, quando può essere ottimizzato per qualcosa di più semplice?

+1

Non deve essere un caso di uso comune. I compilatori hanno lo scopo di prevedere e prevenire la compilazione di cose che non hanno senso. – itachi

+1

@itachi Non proprio. Ci sono molti modi stupidi per scrivere codice, e scrivere ottimizzazioni per tutti loro renderebbe il compilatore difficile da mantenere e incline agli stessi bug. – RealSkeptic

+0

Dopo aver completamente annullato Minecraft, posso tranquillamente dire che Java esegue ottimizzazioni semantiche molto piccole, se non nessuna. – Qix

risposta

13

Il numero javac non ha o ha poca o nessuna ottimizzazione. L'ottimizzazione si verifica durante la compilazione just-in-time (JIT) del bytecode. Questo ha senso, perché con questo approccio è possibile ottimizzare in modo diverso per diverse piattaforme di destinazione e ottenere i massimi risultati di ottimizzazione.

Problemi correlati