sobota, czerwca 22, 2019

Java 8 + lambdy = wolno ;-)

Używamy w pracy Codility to testowania kandydatów, używamy go też czasem w ramach konkursów na różnych konferencjach.
I okazuje się, że Codility niechcący kara ludzi, którzy znają nowszą Java'ę ;-)

Jeśli ktoś operuje na kolekcji przy pomocy pętli to może dostać ocenioną złożoność O(n), jeśli użyje strumieni i lambd to może dostać ocenioną złożoność O(n*log(n)).

A wszystko przez to, że w Java 8 lambdy nie są najszybsze.

Widać to świetnie gdy używa się computeIfAbsent, zamiast getOrDefault w mapach.
Bo kod z computeIfAbsent wykonuje się zwykle wolniej, mimo tego, że getOrDefault tworzy nowy obiekt za każdym razem gdy jest wołane.

A wszystko przez to, że lambda musi być najpierw zbudowana ;-) i po to kompilator dodaje wywołanie metody LambdaMetafactory.metafactory, które jest wołane przy pomocy invokedynamic.

A w Java 8 wywołanie tego trwa wieki....
Coś co wykonuje się w mniej niż 10 ms, może się wykonywać nawet 80 ms.

Na szczęście w Java 11 wydaje się, że wszystko jest szybsze i nie widać znaczącej różnicy w wykonaniu kodu z lambdami i bez.


Podobne postybeta
Zaczynam woleć Map nad Map ;-)
Mody w rekrutacji IT ;-)
Kilka prostych wzorów do szacowania :-)
Sztuczki tropiciela błędów - breakpoint na sterydach ;-)
No i z lambdy nici

Brak komentarzy:

Prześlij komentarz