"Ne vale la pena" ha bisogno di un contesto, ad esempio quanto sia più semplice scrivere, leggere e mantenere rispetto a quanto più velocemente rende l' utente notevolmente più reattivo, interattivo, richiedendo meno tempo per l'attesa.
Risparmiare qualche soldo per acquistare una lattina di soda non mi farà molto bene se devo percorrere una distanza per salvare quei penny, soprattutto dato che al giorno d'oggi raramente bevo soda. Risparmiare qualche soldo per lattina con un acquisto di un milione di lattine di bibite potrebbe essere un grosso problema.
Nel frattempo risparmiando qualche soldo quando due persone sono proprio accanto a me e una offre esattamente la stessa cosa per qualche soldo in meno e l'altra no, e scelgo quella più costosa perché mi piace che il loro cappello sembri meglio un caso sciocco di pessimizzazione.
Ciò che trovo spesso le persone che chiamano "micro-ottimizzazioni" sembrano curiosamente prive di misurazioni, contesto e discussione da parte dell'utente, quando dovrebbero assolutamente essere tutte e tre le considerazioni su tali ottimizzazioni se non sono banali da applicare. Per me una corretta micro-ottimizzazione in questi giorni si riferisce a cose come layout di memoria e schemi di accesso, e sebbene possano sembrare "micro" a fuoco, non sono micro effetti.
Sono riuscito, non molto tempo fa, a ridurre un'operazione da 24 secondi a 25 millisecondi (circa 960 volte più veloce), con output identici (garantiti da test automatizzati), senza cambiare la complessità algoritmica, per lo skinning di diffusione del calore volumetrico, attraverso "micro-ottimizzazioni" (la più grande delle quali derivava da un cambiamento nel layout della memoria che lo ha portato a circa 2 secondi, poi il resto erano cose come SIMD e ulteriori analisi dei mancati cache nella VTune e qualche ulteriore riorganizzazione del layout della memoria).
Wolfire spiega la tecnica qui e ha lottato con il tempo richiesto:
http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/
La mia implementazione è riuscita a riuscire a farlo in millisecondi mentre stava lottando per ridurlo a meno di un minuto:
Dopo aver "micro-ottimizzato" da 24 secondi a 25 ms, questo è stato un punto di svolta nel flusso di lavoro. Ora gli artisti possono cambiare i loro rig in tempo reale a oltre 30 FPS senza aspettare 24 secondi ogni volta che hanno apportato piccole modifiche al loro rig. E questo in realtà ha cambiato l'intero design del mio software poiché non avevo più bisogno di barra di avanzamento e cose di questo tipo, è diventato tutto interattivo. Quindi quella potrebbe essere una "micro-ottimizzazione" nel senso che tutti i miglioramenti sono arrivati senza alcun miglioramento della complessità algoritmica, ma è stata in effetti una "mega-ottimizzazione" che ha reso quello che precedentemente era un processo doloroso, non interattivo in uno in tempo reale, interattivo che ha completamente cambiato il modo in cui gli utenti lavoravano.
Misurazioni, requisiti dell'utente finale, contesto
Mi è piaciuto molto il commento di Robert qui e forse non sono riuscito a esprimere il punto che volevo:
Bene, dai. Nessuno sosterrà che questo tipo di cambiamento non "vale la pena". Sei stato in grado di dimostrare un beneficio tangibile; molte cosiddette microottimizzazioni non possono.
Questa è, nonostante lavori in un campo molto critico in termini di prestazioni con requisiti spesso in tempo reale, l'unica volta che considero qualsiasi micro-ottimizzazione che richiede di andare fuori strada.
E sottolineerei non solo le misurazioni ma anche il suo lato utente. Sono strano nel fatto che sono arrivato nel mio campo attuale (e precedentemente con gamedev) come utente / fan prima, sviluppatore secondo. Quindi non sono mai stato così eccitato dalle solite cose che eccitano i programmatori come risolvere enigmi tecnici; Li ho trovati un peso, ma li sopporterei attraverso il sogno dell'utente che condividevo con altri utenti. Ma ciò mi ha aiutato a essere sicuro che se stavo ottimizzando qualcosa, avrebbe avuto un impatto reale sugli utenti con vantaggi reali. È la mia protezione contro la microottimizzazione senza scopo.
Questo in realtà è importante quanto il profiler secondo me, perché avevo colleghi che facevano cose come micro-ottimizzare la suddivisione di un cubo in un miliardo di sfaccettature solo per soffocare su modelli di produzione del mondo reale come personaggi e veicoli. Il loro risultato è stato impressionante in un certo senso di "demo tecnologica", ma quasi inutile per gli utenti reali, poiché si trattava di profilare, misurare e confrontare casi che non si allineavano ai casi d'uso reali. Quindi è così importante capire prima cosa è importante per gli utenti, sia imparando a pensare e usare il software come uno o collaborando con loro (idealmente entrambi, ma almeno collaborando con loro).