2013-05-26 12 views
7

napisałem klasęDlaczego javac nie optymalizuje pustych bloków try-finally?

class test1 { 

void foo() { } 

} 

i inną klasę z wieloma try- i zwrotów w końcu nic nie robi:

class test2 { 

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

} 

skompilowane je javac (sun-jdk-1.6.0.37, Linux -3.8.13-amd64) i porównał pliki z 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 

Dlaczego druga klasa jest o wiele większa, mimo że obie nic nie robią? Dlaczego javac nie optymalizuje drugiego kodu? Czy istnieje jakiś powód?

+6

'javac' nie będzie, jednak JVM prawdopodobnie to zrobi. Optymalizacja w Javie odbywa się w czasie wykonywania. – fge

+0

możesz rzucić okiem na: http://stackoverflow.com/questions/4997513/javac-optimization-flags – awsome

+2

Myślę, że lepszym pytaniem jest, dlaczego NAPISAĆ puste try/finally bloki ... – arcy

Odpowiedz

2

javac nie ma prawie żadnej optymalizacji. Java używa JIT, a pomysł jest taki, że w czasie wykonywania masz znacznie więcej informacji do wykonywania naprawdę dobrych i użytecznych optymalizacji niż w czasie kompilacji.

Powiązane problemy