Se lavori in aree veramente critiche per le prestazioni, non puoi rinunciare all'efficienza come un ripensamento. È una delle cose più importanti da considerare quando si progettano in anticipo in quei casi e in modi che riguardano la manutenibilità del risultato finale.
Non è possibile progettare e implementare un server su larga scala e iniziare semplicemente a scrivere codice semplice e ben documentato che utilizza solo funzioni di blocco per tutto ciò con un blocco thread globale che blocca l'intero sistema per elaborare ogni singola richiesta client mentre non ponendo alcun pensiero in uno stato condiviso, in un conflitto di argomenti e in un'asincronicità. Questa è una ricetta per il disastro e la necessità di riprogettare e riscrivere la maggior parte del codice ben documentato che hai scritto in modi che potrebbero portare alla base di codice più difficile da immaginare, afflitta da condizioni di gara e deadlock come risultato del tentativo per ottenere l'efficienza richiesta a posteriori, al contrario di avere semplicemente pensato a progetti efficienti, semplici e funzionanti in anticipo.
Un team di sviluppo di videogiochi 8 mesi in produzione con un motore che va a 2 fotogrammi al secondo sull'hardware più beeo con 32 core, mentre la tendenza a fermarsi per 15 secondi ogni volta che lo schermo è occupato è improbabile che ottenga immediatamente un utilizzo prodotto fissando solo un piccolo hotspot localizzato. È probabile che il loro design sia FUBAR in modi che garantiscano una rivisitazione epica del tavolo da disegno e modifiche al progetto che potrebbero sovrapporsi a ogni angolo del codice base.
Con John Carmack, ha parlato una volta di come una demo tecnologica deve funzionare al minimo da centinaia a migliaia di frame al secondo per integrarla nella produzione. Questa non è un'ossessione malsana per l'efficienza. Sa in anticipo che i giochi devono essere eseguiti, nella loro interezza, a 30+ FPS affinché i clienti lo trovino accettabile. Di conseguenza, un piccolo aspetto come un sistema di ombre morbide non può essere eseguito a 30 FPS, altrimenti il gioco nel suo complesso non può essere abbastanza veloce da fornire il feedback in tempo reale richiesto. È inutilizzabile fino a quando non raggiunge l'efficienza richiesta. In tali aree critiche per le prestazioni in cui vi è un requisito fondamentale per l'efficienza, una soluzione che non riesce a raggiungere una velocità adeguata non è in realtà migliore di quella che non funziona affatto, poiché entrambi sono completamente inutilizzabili . E non è possibile progettare un efficiente sistema di ombre morbide che funzioni da centinaia a migliaia di fotogrammi al secondo come richiesto per un motore di gioco in tempo reale, a meno che non si metta in primo piano una quantità di pensiero predominante sulla sua efficienza. Infatti, in questi casi, il 90% del lavoro è orientato all'efficienza poiché è banale trovare un sistema di ombre morbide che funzioni bene a 2 ore per frame usando il tracciamento dei percorsi, ma non ci si può aspettare di sintonizzarlo per funzionare a centinaia di fotogrammi al secondo senza un cambio di approccio completamente diverso.
Quando l'efficienza è una parte fondamentale del design di un'applicazione, non ci si può aspettare di ottenere un'efficienza con il senno di poi senza perdere molto più tempo di quanto si è risparmiato ignorandola, dal momento che non si può pretendere di ottenere un design funzionante a posteriori. Nessuno dice: "Io sono d'accordo a rimandare il pensiero sul design solo più tardi. Basta documentare bene il codice e si può trovare un design adeguato più tardi ." Ma in architetture critiche per le prestazioni, è quello che stai facendo in modo efficace se non metti molta cura e attenzione in progetti efficienti in anticipo.
Ora questo non significa che devi mettere a punto le tue implementazioni in modo immediato. Per i dettagli di implementazione, c'è molto spazio per scorrere le soluzioni più veloci dopo la misurazione, a condizione che il design non debba essere modificato, e spesso questo è il modo più produttivo per farlo. Ma a livello di progettazione, significa che devi mettere la riflessione sufficiente su come il design e l'architettura si relazioneranno all'efficienza fin dall'inizio.
La differenza chiave qui è design . Non è facile apportare grandi cambiamenti ai progetti con il senno di poi, poiché i progetti accumulano dipendenze e le dipendenze si interromperanno se il progetto cambia. E se un progetto ha l'esigenza di essere ragionevolmente efficiente o, in alcuni casi, che la sua qualità sia in gran parte misurata dalla sua efficienza, allora non dovresti aspettarti di essere in grado di ottenere un design adeguato come un ripensamento. Con qualsiasi prodotto competitivo in cui l'efficienza è un enorme aspetto della qualità, sia che si tratti di sistemi operativi o compilatori o processori video o raytracers o motori di gioco o motori fisici, le riflessioni sull'efficienza e le rappresentazioni dei dati sono state meticolosamente pensate sin dall'inizio. E in quei casi non è prematura l'ottimizzazione di mettere così tanto in mente l'efficienza in anticipo. Stava ponendo questo pensiero esattamente nel momento più produttivo per farlo, e sin dall'inizio.