Czas to pojęcie względne

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.

5 myśli na temat “Czas to pojęcie względne

  1. 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.

  2. 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.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax