Dziś będzie lżej. Wczorajszy tekst o pisaniu kodu bez ifów spotkał się ze stwierdzeniem „po chuj tak jak to jest nieoptymalne”. Ok, prawda. Kod tak napisanego equals będzie w skrajnym przypadku, czyli z jednym polem, które nigdy nie jest null, wolniejszy o jakiś rząd wielkości. W takim przypadku będzie też, być może, trochę bardziej zagmatwany. Zresztą zwróciłem uwagę na ten problem poruszając kwestię narzędzi do analizy statycznej. Chodziło tam jednak o pokazanie, że można ukryć ifologię i do testów skierować tylko kod, który ma jedną ścieżkę przebiegu.
Dobra, ale co z optymalizacją. Pytanie czy optymalizacja polegająca na eliminowaniu kolejnych opakowań ma sens w typowym przypadku. Załóżmy, że będziemy wstanie urwać 1ms na każdym wywołaniu metody equals. Czy to dużo czy mało?
Poniżej tabelka z przelicznikiem
Operacja | Czas wykonania (około) | Czas po skalowaniu 1ns → 1s |
---|---|---|
Dostęp do L1 | 1ns | 1s |
Dostęp do RAM | 30ns | około 30s |
Dostęp do dysku (HDD 7200) | 4ms | około 47 dni |
Ping google.com ode mnie z domu | średnia dla 10 wywołań 18,6ms | około 215 dni |
Zatem zanim zaczniemy urywać µs na pojedynczych elementach kodu to może warto popatrzeć na prawdziwe spowalniacze.
https://www.quora.com/What-are-the-numbers-that-every-computer-engineer-should-know-according-to-Jeff-Dean
Przy optymalizacji wazne sa dwie rzeczy:
– czas dzialania funkcji
– srednia liczba wywolan funckji podczas jednej sesji uzytkownika
Ze wzgledu na to drugie mozna by sie zastanowic czy jednak nie warto miec wydajnego equals().
Tu cos na temat: http://digitaljoel.nerd-herders.com/2011/02/17/java-equals-implementation-performance/
Ważny jest tu raczej drugi punkt, bo jak wspomniałem czasami próba urwania np. 10ms w sesji użytkownika na super optymalizowaniu equals jest sztuką dla sztuki gdy mamy błędy w części biznesowej.
Jeśli equals trwa 10ms, to chyba jednak warto mu się przyjrzeć. 🙂
Inna sprawa, że cała dyskusja prawdopodobnie nie ma sensu, bo JIT może sobie poradzić z takim kodem.
@Konrad to jeszcze inna sprawa. BTW, nadal nikt nie załapał dlaczego equals?