La tua intuizione può migliorare con il tempo. Lo butterei fuori, forse un po 'controverso, ma in molti anni di utilizzo di VTune e CodeAnalyst e ora di CodeXL, direi che nelle mie intuizioni sono molto più preciso di prima su dove saranno gli hotspot, almeno per il punto in cui non sono più colto di sorpresa quando registro un codice. Ciò non significa che io tenti di ottimizzare le cose alla cieca.
Il profiling ha effettivamente aumentato la mia dipendenza dai profiler, non diminuito. Sto solo dicendo che posso prevedere più facilmente quali saranno i risultati del profiling in una certa misura e inoltre eliminare con successo gli hotspot e migliorare il tempo necessario per completare l'operazione user-end senza prendere pugnalate cieche nel buio e mancanti (qualcosa che tu puoi fare anche quando usi un profiler finché non inizi a capire non solo quali sono gli hotspot, ma perché sono esattamente hotspot rispetto a, ad esempio, errori di 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 agli hotspot più grandi e più ovvi, ma non tutte le sottigliezze intermedie. Naturalmente se hai un'operazione di fine utente che richiede un'ora per completare e c'è un algoritmo di complessità quadratica spalancata che elabora un input che copre centomila elementi, puoi probabilmente ottenere ricchi giochi d'azzardo per i tuoi risparmi di tutta la vita sull'idea che sia la complessità quadratica algoritmo in difetto qui. Ma questo non ti dà informazioni dettagliate o, ad esempio, ti consente di sapere esattamente cosa non di contribuire al tempo.
C'è così tanto valore quando si inizia a profilare e vedere dove tutte le cose che pensavate avrebbero potuto essere un grande contributo di tempo non hanno contribuito molto; non le sbalorditive fonti ovvie di inefficienze, ma quelle che sospettate potrebbero essere state leggermente inefficienti ma, dopo averli profilati, rendendosi conto che a malapena hanno contribuito in qualsiasi momento. E questo è potenzialmente il punto in cui ottieni l'intuizione più intuitiva: ti stai sbagliando in tutte quelle aree sottili in cui non è ovvio esattamente quanto tempo è stato speso.
L'intuizione umana oltre l'ovvia complessità algoritmica spesso inizia 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 alla DRAM sul disco. Non sembra intuitivo pensare che l'aritmetica ridondante possa essere più veloce di 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 ci sia da fare mentre scartiamo cose come il costo di prendere decisioni e carichi di memoria e negozi. Ciò che è efficiente per l'hardware è spesso molto contro-intuitivo in modi che infrangeranno tutte le tue assunzioni umane a partire, ma naturalmente devi misurare per infrangere le tue ipotesi in modi in cui hai imparato e allineato il tuo intuito più vicino al modo in cui l'hardware funziona davvero.
Il miglioramento dell'intuizione può aiutare, attraverso la creazione di profili, a design dell'interfaccia . I progetti di interfaccia sono molto costosi da cambiare a posteriori, con costi in aumento proporzionali al numero di posti che dipendono da tale interfaccia. Quando inizi a migliorare la tua intuizione, puoi iniziare a progettare le interfacce meglio la prima volta in modi che lasciano spazio per l'ottimizzazione futura senza costosi cambiamenti di progettazione. Di nuovo però, questa intuizione è qualcosa che generalmente sviluppi, e continua a svilupparsi indefinitamente, avendo sempre in mano quel profiler.