La tua intuizione può migliorare con il tempo. Lo butterei fuori, forse un po 'controverso, ma nel corso di molti anni di utilizzo di VTune e CodeAnalyst e ora CodeXL, direi che sono molto più preciso nelle mie intuizioni rispetto a prima su dove saranno gli hotspot, almeno per il punto in cui non sono più colto di sorpresa quando profilo un po 'di codice. Ciò non significa che cerco di ottimizzare le cose alla cieca.
La profilazione ha effettivamente aumentato la mia dipendenza dai profiler, non diminuita. Sto solo dicendo che posso anticipare più facilmente quali saranno i risultati della profilazione in una certa misura e inoltre, eliminare con successo gli hotspot e migliorare il tempo necessario per completare l'operazione dell'utente finale senza prendere pugnalate cieche nel buio e mancanti (qualcosa che può fare anche quando si utilizza un profiler fino a quando non si inizia a capire non solo quali sono gli hotspot, ma perché esattamente sono hotspot rispetto, ad esempio, ai mancati cache).
Tuttavia, non è stato fino a quando ho iniziato a utilizzare i profiler che ho iniziato a migliorare quell'intuizione. Uno dei motivi è perché se hai familiarità con il tuo codice, le tue intuizioni potrebbero essere corrette rispetto ai punti più grandi e ovvi, ma non tutte le sottigliezze nel mezzo. Naturalmente, se hai un'operazione di fine utente che richiede un'ora per il completamento e c'è un algoritmo di complessità quadratica spalancata che elabora un input che comprende centinaia di migliaia di elementi, probabilmente puoi uscirne ricco scommettendo i tuoi risparmi sulla vita intera sull'idea che è la complessità quadratica algoritmo in difetto qui. Ma questo non ti dà alcuna visione dettagliata o, diciamo, ti fa sapere esattamente cosa non sta contribuendo al tempo.
C'è così tanto valore da avere quando inizi a profilare e vedere dove tutte le cose che pensi possano essere state un contributo maggiore del tempo non hanno contribuito molto tempo; non le evidenti fonti di inefficienza spalancate, ma quelle che sospettavi potrebbero essere state leggermente inefficienti ma, dopo aver profilato, capito che a malapena hanno contribuito in qualsiasi momento. Ed è potenzialmente lì che ottieni le intuizioni più intuitive è trovarti a essere mostrato sbagliato in tutte quelle aree sottili in cui non è ovvio esattamente quanto tempo viene speso.
L'intuizione umana oltre l'evidente complessità algoritmica spesso inizierà in modo errato perché ciò che è efficiente per la macchina e ciò che è efficiente per la mente umana sono molto diversi. All'inizio non è così intuitivo pensare alle gerarchie di memoria che vanno dai registri alla cache della CPU, dalla DRAM al disco. Non viene intuitivamente pensare che l'aritmetica ridondante possa essere più veloce rispetto a fare più ramificazioni o accessi alla memoria di una tabella di ricerca per saltare alcuni lavori di elaborazione. Tendiamo a pensare in termini di quanto lavoro c'è da fare mentre scontiamo cose come il costo di prendere decisioni, carichi di memoria e negozi. Ciò che è efficiente per l'hardware è spesso molto intuitivo in modi che spezzeranno tutti i tuoi presupposti umani,
Laddove migliorare l'intuizione può aiutare, attraverso la profilazione, è la progettazione dell'interfaccia . I progetti di interfaccia sono molto costosi da cambiare a posteriori, con costi che aumentano in proporzione al numero di posti a seconda di tale interfaccia. Quando inizi a migliorare la tua intuizione, puoi iniziare a progettare meglio le interfacce la prima volta in modi che lascino spazio per l'ottimizzazione futura senza costose modifiche alla progettazione. Ancora una volta, però, quell'intuizione è qualcosa che generalmente sviluppi e continui a sviluppare indefinitamente, avendo sempre in mano quel profiler.