„Warto” potrzebuje kontekstu, na przykład o ile łatwiej jest pisać, czytać i utrzymywać w porównaniu do tego, o ile szybciej sprawia, że użytkownik jest znacznie bardziej responsywny, interaktywny i wymaga mniej czasu na czekanie.
Zaoszczędzenie kilku groszy na zakup puszki z napojem nie przyniesie mi wiele dobrego, jeśli będę musiał pokonać odległość, aby zaoszczędzić te grosz, szczególnie biorąc pod uwagę, że w dzisiejszych czasach rzadko piję napoje gazowane. Oszczędność kilku groszy na puszkę przy zakupie miliona puszek napojów gazowanych może być ogromną sprawą.
Tymczasem oszczędzając kilka groszy, gdy dwie osoby są tuż obok mnie, a jedna oferuje dokładnie to samo za kilka groszy taniej, a druga nie, a ja wybieram droższą, ponieważ podoba mi się ich kapelusz, wydaje się głupotą pesymizacji.
To, co często uważam za ludzi nazywających „mikrooptymalizacje”, wydaje się być dziwnie pozbawione pomiarów, kontekstu i dyskusji użytkowników, kiedy absolutnie wszystkie trzy powinny rozważyć takie optymalizacje, jeśli nie są trywialne w zastosowaniu. Dla mnie właściwa mikrooptymalizacja dotyczy obecnie takich układów, jak układy pamięci i wzorce dostępu, i chociaż mogą wydawać się „mikro” w centrum uwagi, nie działają one tak naprawdę.
Nie tak dawno temu udało mi się zredukować operację z 24 sekund do 25 milisekund (około 960 razy szybciej), z identycznymi wyjściami (zabezpieczonymi automatycznymi testami), bez zmiany złożoności algorytmicznej, dla skórowania z dyfuzją objętościową poprzez „mikrooptymalizacje” (największa z nich polegała na zmianie układu pamięci, która zmniejszyła się do około 2 sekund, następnie pozostałe rzeczy to SIMD i dalsza analiza braków pamięci podręcznej w VTune oraz pewne dalsze zmiany układu pamięci).
Wolfire wyjaśnia tutaj technikę i zmagał się z wymaganym czasem:
http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/
Moja implementacja zdołała to zrobić w milisekundach, gdy starał się sprowadzić ją do mniej niż minuty:
Po „mikrooptymalizowaniu” go z 24 sekund do 25 ms było to przełomem w przepływie pracy. Teraz artyści mogą zmieniać swoje zestawy w czasie rzeczywistym przy ponad 30 klatkach na sekundę, bez czekania 24 sekund za każdym razem, gdy dokonają jakichkolwiek drobnych zmian w swoim urządzeniu. I to faktycznie zmieniło cały projekt mojego oprogramowania, ponieważ nie potrzebowałem już paska postępu i tego rodzaju rzeczy, wszystko stało się interaktywne. Może to być „mikrooptymalizacja” w tym sensie, że wszystkie ulepszenia pojawiły się bez żadnej poprawy złożoności algorytmu, ale w efekcie była to raczej „mega optymalizacja”, która sprawiła, że wcześniej był to bolesny, nieinteraktywny proces w interaktywny w czasie rzeczywistym, który całkowicie zmienił sposób działania użytkowników.
Pomiar, wymagania użytkownika końcowego, kontekst
Naprawdę podobał mi się komentarz Roberta i być może nie udało mi się wskazać tego, co chciałem:
No dalej. Nikt nie będzie argumentował, że taka zmiana nie jest „warta”. Udało ci się wykazać namacalną korzyść; wiele tak zwanych mikrooptymalizacji nie może.
Jest to, pomimo pracy w bardzo krytycznym dla wydajności polu z często wymaganiami czasu rzeczywistego, jedyny raz, kiedy rozważam jakąkolwiek mikrooptymalizację, która wymaga zejścia mi z drogi.
Chciałbym podkreślić nie tylko pomiary, ale także stronę użytkownika. Jestem dziwakiem, ponieważ przyszedłem do mojej bieżącej dziedziny (i wcześniej gamedev) jako użytkownik / fan jako pierwszy, a programista jako drugi. Więc nigdy nie byłem tak podekscytowany zwykłymi rzeczami, które ekscytują programistów, takimi jak rozwiązywanie zagadek technicznych; Uznałem, że to dla nich ciężar, ale przetrwałbym je poprzez sen użytkowników końcowych, który podzieliłem się z innymi użytkownikami. Ale pomogło mi to upewnić się, że jeśli coś zoptymalizuję, miałoby to realny wpływ na użytkowników z rzeczywistymi korzyściami. To moje zabezpieczenie przed mikrooptymalizacją bezcelowo.
Moim zdaniem jest to tak samo ważne, jak profiler, ponieważ miałem kolegów, którzy robili takie rzeczy, jak mikrooptymalizacja podziału kostki na miliard aspektów tylko po to, aby udusić rzeczywiste modele produkcyjne, takie jak postacie i pojazdy. Ich wynik był imponujący w pewnym sensie „tech demo”, ale prawie bezużyteczny dla rzeczywistych użytkowników, ponieważ profilowali, mierzyli i analizowali przypadki, które nie były zgodne z rzeczywistymi przypadkami użycia. Dlatego tak ważne jest, aby najpierw zrozumieć, co jest ważne dla użytkowników, ucząc się myśleć i korzystać z takiego oprogramowania lub współpracując z nimi (najlepiej oba, ale przynajmniej współpracuj z nimi).