2013-05-26 14 views
7

Ho scritto una classePerché javac non ottimizza i blocchi try-finally vuoti?

class test1 { 

void foo() { } 

} 

e un'altra classe, con un sacco di try- e infine-dichiarazioni non fare nulla:

class test2 { 

void foo() { 
    try{} finally{} try{} finally{} try{} finally{} try{} finally{} try{} finally{} 
} 

} 

li compilato con javac (sun-jdk-1.6.0.37, linux -3.8.13-amd64) e ha confrontato i file con od.

test1.class 
    0000000 066143 071541 020163 062564 072163 020061 005173 073012 
    0000020 064557 020144 067546 024157 020051 020173 005175 076412 
    0000040 

test2.class 
    0000000 177312 137272 000000 031400 010400 000012 000003 003415 
    0000020 007000 000007 000417 003000 064474 064556 037164 000001 
    0000040 024003 053051 000001 041404 062157 000545 007400 064514 
    0000060 062556 072516 061155 071145 060524 066142 000545 001400 
    0000100 067546 000557 006400 072123 061541 046553 070141 060524 
    0000120 066142 003545 010000 000001 051412 072557 061562 043145 
    0000140 066151 000545 005000 062564 072163 027062 060552 060566 
    0000160 000014 000004 000405 002400 062564 072163 000462 010000 
    0000200 060552 060566 066057 067141 027547 061117 062552 072143 
    0000220 000001 065023 073141 027541 060554 063556 052057 071150 
    0000240 073557 061141 062554 020000 001000 001400 000000 000000 
    0000260 001000 000000 002000 002400 000400 003000 000000 016400 
    0000300 000400 000400 000000 002400 133452 000400 000261 000000 
    0000320 000001 000007 000000 000006 000001 000000 000001 000000 
    0000340 000010 000005 000001 000006 000000 000204 000001 000006 
    0000360 000000 123443 003000 025514 123677 003000 026115 123677 
    0000400 003000 026516 123677 004000 002072 002031 123677 004000 
    0000420 002472 002431 130677 002400 001400 002000 001400 000000 
    0000440 004400 005000 004400 000000 007400 010000 007400 000000 
    0000460 012400 013400 012400 000000 016400 017400 016400 000000 
    0000500 001000 003400 000000 003000 000400 000000 001400 004400 
    0000520 000000 015400 005000 003503 005000 041002 000007 001012 
    0000540 003502 005000 041002 000007 002012 003502 005000 000004 
    0000560 000001 000013 000000 000002 000014 
    0000571 

Perché la seconda classe è molto più grande anche se entrambi non fanno nulla? Perché javac non ottimizza il secondo codice? C'è qualche ragione?

+6

'javac' non lo farà, tuttavia la JVM molto probabilmente lo farà. L'ottimizzazione in Java viene eseguita in fase di runtime. – fge

+0

si può dare un'occhiata a: http://stackoverflow.com/questions/4997513/javac-optimization-flags – awsome

+2

Penso che una domanda migliore è perché WRITE vuoti try/finally blocchi ... – arcy

risposta

2

javac quasi nessuna ottimizzazione. Java utilizza JIT e l'idea è che in fase di esecuzione si disponga di molte più informazioni per eseguire ottimizzazioni davvero utili e utili rispetto al momento della compilazione.

Problemi correlati