2010-04-25 11 views

Odpowiedz

53

Muszę jeszcze znaleźć przypadek, w którym poprawia wydajność, a próbowałem w kilku różnych miejscach. JVM wydaje się być całkiem dobry w zakładaniu, kiedy jest to możliwe, i nawet jeśli pytasz o @line w Scali, nie zawsze może to zrobić (i czasami zauważyłem, że nawet wtedy, gdy myślę, że powinien być w stanie).

W miejscu, gdzie można oczekiwać, aby zobaczyć różnicę kodu bajtowego jest coś takiego:

object InlineExample { 
    final class C(val i: Int) { 
    @inline def t2 = i*2 
    @inline def t4 = t2*2 
    } 
    final class D(val i: Int) { 
    def t2 = i*2 
    def t4 = t2*2 
    } 
} 

gdy skompilowany z -optimise. I widzisz różnicę, ale generalnie nie działa ona szybciej, ponieważ kompilator JIT może zauważyć, że te same optymalizacje mają zastosowanie do D.

Warto więc wypróbować ostatnie etapy optymalizacji, ale nie zawracałbym sobie głowy rutynowym sprawdzaniem, czy nie ma to wpływu na wydajność.

+0

Dzięki za zgłoszenie wyników testu; uratowałeś mnie i pewnie jeszcze jakiś czas :) –

+10

Twoja argumentacja jest prawdziwa tylko wtedy, gdy na planecie był tylko jeden kompilator JIT. - Ale to nie jest prawda. Jest Android, jest IBM, który produkuje własne JVM. Więc wszystko, co kompilator Scala robi * na pewno * jest lepsze niż coś, co może zrobić jakiś JIT *. – Martin

+4

@Martin - Przyznaję, że nie próbowałem Androida. Próbowałem JRockit i IBM JVM z takim samym skutkiem jak Sun JVM (tj. Brak). –