"Ne vale la pena" ha bisogno di un contesto, come quanto è più semplice scrivere, leggere e gestire e quanto più velocemente rende qualcosa al utente notevolmente più reattivo , interattivo, richiedendo meno tempo per loro di aspettare.
Risparmiare pochi centesimi per acquistare una lattina di soda non mi farà molto bene se devo percorrere una distanza per risparmiare quei centesimi, soprattutto dato che di questi tempi non bevo quasi mai la soda. Risparmiare qualche soldino per barattolo su un acquisto di un milione di lattine di bibite potrebbe essere un grosso problema.
Nel frattempo risparmiamo pochi centesimi quando due persone sono proprio accanto a me e uno offre la stessa identica cosa per pochi centesimi in meno e l'altro no, e scelgo quello più costoso perché mi piace che il loro cappello sia migliore un caso folle di pessimizzazione.
Quello che spesso trovo le persone che chiamano "micro-ottimizzazioni" sembrano essere curiosamente prive di misurazioni, contesto e discussioni da parte dell'utente, quando dovrebbero essere tutte e tre le cose da considerare tali ottimizzazioni se non sono banali da applicare . Per me un corretto micro-ottimizzazione in questi giorni si riferisce a cose come layout di memoria e pattern di accesso, e mentre potrebbero sembrare "micro" a fuoco, non hanno effetto micro.
Sono riuscito, non molto tempo fa, a ridurre un'operazione da 24 secondi a 25 millisecondi (circa 960 volte più veloce), con uscite identiche (garantite da test automatici), senza modifiche alla complessità algoritmica, per diffusione volumetrica del calore skinning, attraverso "micro-ottimizzazioni" (il più grande dei quali derivava da un cambiamento di layout della memoria che lo portò a circa 2 secondi, il resto erano cose come SIMD e ulteriori analisi delle mancate cache in VTune e qualche ulteriore riorganizzazione della memoria disposizione).
Wolfire spiega la tecnica qui, e ha lottato con il tempo richiesto:
link
La mia implementazione è riuscita a essere in grado di farlo in millisecondi, mentre si sforzava di ridurlo a meno di un minuto:
Dopoaverlo"ottimizzato per micro" da 24 secondi a 25 ms, questo era un punto di svolta nel flusso di lavoro. Ora gli artisti possono cambiare i loro impianti in tempo reale a oltre 30 FPS senza attendere 24 secondi ogni volta che apportano qualche piccolo cambiamento al loro impianto. E questo ha effettivamente cambiato l'intero design del mio software, dal momento che non avevo più bisogno di barra di progresso e cose del genere, ma tutto è diventato interattivo. Quindi potrebbe essere una "micro-ottimizzazione" nel senso che tutti i miglioramenti sono venuti senza alcun miglioramento della complessità algoritmica, ma in effetti è stata piuttosto una "mega-ottimizzazione" che ha reso quello che prima era un processo doloroso e non interattivo in tempo reale, interattivo, che ha completamente cambiato il modo in cui gli utenti hanno lavorato.
Misurazione, requisiti di fine utente, contesto
Mi è piaciuto molto il commento di Robert qui e forse non sono riuscito a esprimere il punto che volevo:
Well, c'mon. Nobody is going to argue that this kind of change isn't "worth it." You were able to demonstrate a tangible benefit; many so-called micro-optimizations cannot.
Questo, nonostante si lavori in un campo molto critico per le prestazioni con requisiti spesso in tempo reale, l'unica volta che considero una micro-ottimizzazione che richiede di andare fuori dai miei schemi.
E vorrei sottolineare non solo le misurazioni, ma il lato utente di esso. Sono uno strano in quanto sono arrivato al mio attuale campo (e precedentemente gamedev) come utente / fan prima, sviluppatore secondo. Quindi non sono mai stato così eccitato dalle solite cose che entusiasmano i programmatori come risolvere enigmi tecnici; Li ho trovati un peso, ma li avrei sopportati attraverso il sogno dell'utente che condividevo con altri utenti. Ma questo mi ha aiutato a essere sicuro che se stavo ottimizzando qualcosa, avrebbe un impatto reale sugli utenti con reali benefici. È la mia salvaguardia contro la micro-ottimizzazione senza scopo.
Questo è tanto importante quanto il profiler a mio parere, perché avevo colleghi che facevano cose come la micro-ottimizzazione della suddivisione di un cubo in un miliardo di sfaccettature solo per soffocare su modelli di produzione reali come personaggi e veicoli. Il loro risultato è stato impressionante in alcuni "tech demo", ma quasi inutile per gli utenti effettivi, perché stavano profilando e misurando e confrontando casi non allineati con casi d'uso reali. Quindi è molto importante capire prima cosa è importante per gli utenti, sia imparando a pensare e utilizzare il software come uno o collaborando con loro (idealmente entrambi, ma almeno collaborando con loro). La cosa più importante per me, se vogliamo ottenere micro e iniziare i cicli di rasatura e fallire nella cache e così via, è iniziare a diventare veramente bravo a dare priorità a dove andare per farlo (che naturalmente corrisponde alla conoscenza di tutti i posti che non dovremmo Fallo, per il quale sia la comprensione del profiler che quella dell'utente sono molto importanti).