Sua intuição pode melhorar com o tempo. Eu diria isso, talvez um pouco controverso, mas ao longo de muitos anos usando o VTune e o CodeAnalyst e agora o CodeXL, eu diria que sou muito mais preciso em minhas intuições do que antes sobre onde os pontos de acesso estarão, pelo menos para o ponto em que não sou mais pego de surpresa quando perfil algum código. Isso não significa que eu tente otimizar as coisas cegamente.
Na verdade, o perfil aumentou minha dependência de criadores de perfil, não a diminuiu. Estou apenas dizendo que posso antecipar com mais facilidade quais serão os resultados de criação de perfis em certa medida e além disso, eliminar com êxito pontos de acesso e melhorar o tempo necessário para concluir a operação de usuário final sem fazer facadas cegas no escuro e em falta (algo que você pode ser feito mesmo ao usar um criador de perfil até você começar a entender não apenas quais são os pontos ativos, mas por que exatamente eles são pontos ativos em relação a, digamos, falhas de cache).
No entanto, foi só quando comecei a usar os criadores de perfil que comecei a melhorar essa intuição. Um dos motivos é que, se você conhece bem seu código, seus palpites podem estar corretos em relação aos pontos de acesso maiores e mais óbvios, mas não a todas as sutilezas intermediárias. Naturalmente, se você tem uma operação de final de usuário que leva uma hora para concluir e existe um algoritmo de complexidade quadrática aberto que processa uma entrada que abrange cem mil elementos, provavelmente você pode sair rico apostando suas economias inteiras na ideia de que é a complexidade quadrática algoritmo com falha aqui. Mas isso não fornece informações detalhadas ou, por exemplo, informa exatamente o que não está contribuindo para o tempo.
Há tanto valor quando você começa a criar perfis e a ver onde todas as coisas que você pensou que poderiam ter contribuído mais para o tempo não estavam contribuindo por muito tempo; não as óbvias fontes óbvias de ineficiências, mas as que você suspeitava que poderiam ter sido um pouco ineficientes, mas, após o perfil, percebendo que elas mal contribuíam a qualquer momento. E é potencialmente aí que você obtém a percepção mais intuitiva de se mostrar errado em todas as áreas sutis em que não é óbvio exatamente quanto tempo está sendo gasto.
A intuição humana além da óbvia complexidade algorítmica geralmente começa incorreta, porque o que é eficiente para a máquina e o que é eficiente para a mente humana são muito diferentes. No início, não é tão intuitivo pensar em hierarquias de memória que vão dos registradores ao cache da CPU, à DRAM e ao disco. Não é intuitivo pensar que a aritmética redundante pode ser mais rápida do que fazer mais acessos de ramificação ou memória de uma tabela de consulta para ignorar algum trabalho de processamento. Tendemos a pensar em termos de quanto trabalho há para fazer, descontando coisas como o custo de tomar decisões e cargas e lojas de memória. O que é eficiente para o hardware geralmente é muito contra-intuitivo, de maneira a quebrar todas as suas suposições humanas começando,
Onde melhorar essa intuição pode ajudar, por meio de criação de perfil, é o design de interface . Os designs de interface são muito caros para mudar em retrospectiva, com os custos aumentando proporcionalmente ao número de lugares, dependendo dessa interface. Quando você começa a melhorar sua intuição, pode começar a projetar interfaces melhor da primeira vez, de maneira a deixar espaço para otimização futura sem alterações dispendiosas no projeto. Mais uma vez, porém, essa intuição é algo que você geralmente desenvolve e continua a desenvolver indefinidamente, sempre tendo esse perfilador em mãos.