Czy to po prostu zaśmieca kod na coś, co tak czy inaczej JIT zajmie się automatycznie?Czy adnotacja @inline w Scali naprawdę pomaga w osiągnięciu wydajności?
58
A
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ść.
Dzięki za zgłoszenie wyników testu; uratowałeś mnie i pewnie jeszcze jakiś czas :) –
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
@Martin - Przyznaję, że nie próbowałem Androida. Próbowałem JRockit i IBM JVM z takim samym skutkiem jak Sun JVM (tj. Brak). –