Jeśli pracujesz w obszarach o krytycznym znaczeniu dla wydajności, nie możesz odkładać wydajności na później. Jest to jedna z najważniejszych rzeczy, o których należy pomyśleć przy wczesnym projektowaniu w takich przypadkach oraz w sposób związany z utrzymywalnością efektu końcowego.
Nie można zaprojektować i wdrożyć serwera na dużą skalę, a po prostu zacząć pisać łatwy, dobrze udokumentowany kod, który po prostu używa funkcji blokowania do wszystkiego z globalną blokadą wątków, która blokuje cały system, aby przetworzyć każde indywidualne żądanie klienta, nie wprowadzając żadnego w ogóle myślał o stanie wspólnym, rywalizacji wątków i asynchroniczności. Taki jest przepis na katastrofę i potrzebę przeprojektowania i przepisania dużej części dobrze udokumentowanego kodu, który napisałeś w sposób, który może prowadzić do najtrudniejszej do utrzymania bazy kodu, jaką można sobie wyobrazić, nękanej warunkami wyścigowymi i impasami w wyniku prób aby osiągnąć wymaganą wydajność z perspektywy czasu, zamiast myśleć z góry o wydajnych, prostych i działających projektach.
Zespół twórców gier trwający 8 miesięcy od produkcji z silnikiem, który uruchamia jedynie 2 klatki na sekundę na swoim najpotężniejszym sprzęcie z 32 rdzeniami, a jednocześnie ma tendencję do zatrzymywania się na 15 sekund za każdym razem, gdy ekran jest zajęty, nie jest w stanie natychmiast uzyskać użytecznego produktu po prostu naprawienie jednego małego zlokalizowanego punktu aktywnego. Są szanse, że ich projekt jest FUBAR w sposób, który uzasadnia epicką rewizję tablicy kreślarskiej i zmiany w projekcie, które mogą kaskadować w każdym rogu bazy kodu.
Z Johnem Carmackiem opowiadał kiedyś o tym, jak demo techniczne musi działać przy minimum setkach do tysięcy klatek na sekundę, aby włączyć go do produkcji. To nie jest niezdrowa obsesja na punkcie wydajności. Wie z góry, że gry muszą działać w całości przy 30+ FPS, aby klienci uznali, że jest to akceptowalne. W rezultacie jeden mały aspekt, taki jak system miękkich cieni, nie może działać przy 30 FPS, w przeciwnym razie gra jako całość nie może być wystarczająco szybka, aby zapewnić wymagane informacje zwrotne w czasie rzeczywistym. Jest bezużyteczny, dopóki nie osiągnie wymaganej wydajności. W obszarach krytycznych pod względem wydajności, w których istnieje podstawowy warunek wydajności, rozwiązanie, które nie osiąga odpowiedniej prędkości, nie jest w rzeczywistości lepsze niż takie, które w ogóle nie działa,. I nie można zaprojektować wydajnego systemu miękkich cieni, który działa z prędkością setek do tysięcy klatek na sekundę, jak jest to wymagane w przypadku silnika gry w czasie rzeczywistym, chyba że z góry zastanowisz się nad jego wydajnością. W rzeczywistości w takich przypadkach ponad 90% pracy jest zorientowane na wydajność, ponieważ wymyślenie miękkiego systemu cieni, który działa dobrze przy 2 godzinach na klatkę przy użyciu śledzenia ścieżki, jest banalne, ale nie można oczekiwać, że dostroi się do pracy z setkami klatek na sekundę bez zupełnie innej zmiany podejścia.
Gdy wydajność jest podstawową częścią projektu aplikacji, nie można oczekiwać, że osiągnie się wydajność z perspektywy czasu, nie tracąc radykalnie więcej czasu niż zaoszczędzono, ignorując go, ponieważ nie można oczekiwać, że osiągnie się działający projekt z perspektywy czasu. Nikt nie mówi: „ Nie ma sensu odkładać na później myślenia o projektowaniu. Po prostu dobrze udokumentuj swój kod, a później możesz wymyślić odpowiedni projekt ”. Ale w architekturach krytycznych pod względem wydajności to właśnie robisz, jeśli nie przykładasz zbyt wiele uwagi i nie zastanawiasz się nad wydajnym projektowaniem z góry.
To nie znaczy, że musisz od razu dostroić swoje implementacje. Aby uzyskać szczegółowe informacje na temat implementacji, po pomiarze jest dużo miejsca na iterację w kierunku szybszych rozwiązań, pod warunkiem, że projekt nie będzie musiał się zmieniać, a często jest to najbardziej produktywny sposób. Ale na poziomie projektowania oznacza to, że od samego początku trzeba dokładnie przemyśleć, w jaki sposób projekt i architektura będą odnosić się do wydajności.
Kluczową różnicą jest tutaj design. Z perspektywy czasu nie jest łatwo wprowadzać duże zmiany w projektach, ponieważ projekty gromadzą zależności, a zależności ulegną zerwaniu w przypadku zmiany projektu. A jeśli projekt wymaga racjonalnej wydajności lub, w niektórych przypadkach, że jego jakość jest w dużej mierze mierzona przez jego efektywność, nie należy oczekiwać, że uda się osiągnąć właściwy projekt jako uzupełnienie. W przypadku produktów konkurencyjnych, w których wydajność jest ogromnym aspektem jakości, niezależnie od tego, czy chodzi o systemy operacyjne, kompilatory, procesory wideo, raytracery, silniki gier czy silniki fizyki, od samego początku starannie rozważano przemyślenia na temat wydajności i reprezentacji danych. W takich przypadkach optymalizacja nie jest zbyt przedwczesna. Umieszczał taką myśl dokładnie w najbardziej produktywnym czasie, aby to zrobić,