Wpis z mikrobloga

@stefansiarrasiarzewski: nie znam dokładnie szczegółów ale android podczas kompilacji zmienia kod tak by pasował do jego wersji, możesz ewentualnie poszukać utilsów by zmienić wersję biblioteki z javy 8 na np 6, chyba tym się dało:
https://github.com/orfjackal/retrolambda

Tylko ostrzegam że nie ręczę za wydajność, lambdy mają za sobą całkiem sporo czarnej magii która ma znacząco poprawiać wydajność, więc po ich przeportowaniu do javy 7/6 może być gorzej, ale za dużo o
  • Odpowiedz
@GotoFinal: Retrolambda po dłuższym zapoznaniu się wcale nie jest taka magiczna. Po prostu parser AST chodzi sobie po kodzie i zbiera lambdy, method references itd. i w czasie prekompilacji generuje odpowiednie implementacje klas implementujących Runnable (czyli coś, co sam ręcznie byś klepał) i ogółem "jedno-metodowców". Przynajmniej tak się dzieje, gdy backport ustawi się na Java 6/7.
  • Odpowiedz
lambdy mają za sobą całkiem sporo czarnej magii


@GotoFinal: ( ͡º ͜ʖ͡º)

Może "magia" niekoniecznie w kontekście Retrolamdby tylko chciałem w skrócie wyjaśnić jak ona działa na androidowym kodzie (w sensie wydajność powinna być podobna jak ręcznie napisany kod).
  • Odpowiedz
@requem: no to pisałem o prawdziwych lambdach w javie 8, tutaj magia jest ciekawsza, bo JIT taki kod stara się inlinować, nie tworzy nowej instancji klasy za każdym razem (jak to się często robiło kiedy lambd nie było), niestety nie zawsze mu to wychodzi, ma to pewne wady, a przynajmniej mialo jak ostatni raz sprawdzałem (początki javy 8) więc różnica w wydajności może się pojawić - przy bardzo wymagających kodach
  • Odpowiedz
@GotoFinal: Ach, źle zrozumiałem kontekst. Osobiście nie wnikałem w świat Javy 8 mocno (Android only) jeszcze, więc tutaj się nie wypowiadam na ten temat. Jedynie czego mogę się domyślać z Twojej wypowiedzi to pewnie problemy z "Closures" (lambdy odwołujące się do obiektów spoza ich scope'a), bo czasami pilnowanie zasięgu zmiennych może faktycznie odbić się na wydajności (a przynajmniej pamięci). Moje wnioski nasunęły się po analizie tego w C#.
  • Odpowiedz
@requem: z tego co pamiętam problemy miało nawet z dość oczywistymi użyciami, jak fakt przekazania lambd do takich funkcji jak Collections.sort(), bo java nie wie gdzie to wtedy zinllinować, bo kod sort jest jeden, a przekazywanych lambd setki, więc najlepiej sobie radzi tam gdzie używasz ich sam.
Ale to coś dawniej się tym bawiłem, więc mogę coś przekręcić.
  • Odpowiedz