Pracuję na systemie analitycznym opartym na Scala (http://www.hiringthing.com) i stwierdzam, że często zadaję sobie następujące pytanie. Biorąc pod uwagę "czystą" funkcję bez efektów ubocznych, jeśli dwukrotnie trafię tę funkcję tymi samymi wejściami, czy mogę oczekiwać, że kompilator ponownie użyje wartości wygenerowanej od pierwszego uruchomienia, czy też przejdzie przez cały kod ponownie. Innymi słowy, czy pierwszy przykład poniżej jest bardziej wydajny niż drugi?Jak efektywny jest kompilator Scali przy ponownym wykorzystaniu znanych wyników funkcji?
def add(x: Int, y: Int) = x + y * 10000000000
val a = add(1,2)
do_something(a)
do_another_thing(a)
vs.
def add(x: Int, y: Int) = x + y * 10000000000
do_something(add(1,2))
do_another_thing(add(1,2))
Jeśli kompilator może rzeczywiście zoptymalizować drugi przypadek, to nie ogranicza się do złożoności funkcji?
Co chcę zrobić, to unikać używania pewne funkcje matematyczne ciężkich wielokrotnie właśnie przez wzgląd na wygodę programowania ...
Dzięki
javap może pomóc zaglądnąć do kodu bajtowego wygenerowanego przez kompilator. Wątpię jednak, aby obecny kompilator dokonał optymalizacji, po prostu dlatego, że bez monad trudno jest określić, czy kod ma jakieś skutki uboczne, ale mogę się mylić. –