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<Key,int[]> nad Map<Key,Integer> ;-)
Mody w rekrutacji IT ;-)
Nie znoszę programowania "funkcyjnego" :-)
Olśnienia :-)
Sztuczki tropiciela błędów - breakpoint na sterydach ;-)
sobota, czerwca 22, 2019
Subskrybuj:
Komentarze do posta (Atom)
Brak komentarzy:
Prześlij komentarz