Normalmente, na maioria dos casos, serão funções mais elaboradas, e não as funções chamadas mais frequentemente um bilhão de vezes em um loop.
Quando você cria um perfil com base em amostra (com uma ferramenta ou manualmente), geralmente os maiores pontos ativos estão em pequenas chamadas frondosas que fazem coisas simples, como uma função para comparar dois números inteiros.
Essa função geralmente não se beneficia de muita, se houver, otimização. No mínimo, esses pontos de acesso granulares raramente são prioridade máxima. É a função que chama a função leaf que pode ser a criadora de problemas, ou a função que chama a função que chama a função, como um algoritmo de classificação abaixo do ideal. Com boas ferramentas, você pode detalhar do chamado ao chamador e também ver quem passa mais tempo chamando o chamador.
Muitas vezes, é um erro ficar obcecado com as chamadas e não olhar para os chamadores no gráfico de chamadas em uma sessão de criação de perfil, a menos que você esteja fazendo as coisas de maneira muito ineficiente no nível micro. Caso contrário, você pode estar suando demais as coisas pequenas e perdendo de vista o quadro geral. Ter um profiler na mão não o impede de ficar obcecado com coisas triviais. É apenas um primeiro passo na direção certa.
Além disso, você deve certificar-se de realizar operações de criação de perfil alinhadas às coisas que os usuários realmente desejam fazer, caso contrário, ser totalmente disciplinado e científico em suas medições e parâmetros de referência é inútil, pois não está alinhado com o que os clientes fazem com o produto. Certa vez, tive um colega que desviou um algoritmo de subdivisão para subdividir um cubo em um bilhão de facetas e ele se orgulhava disso ... exceto que os usuários não subdividem cubos simples de 6 polígonos em um bilhão facetas. A coisa toda diminuiu para um rastreamento quando tentou rodar em um modelo de carro de produção com mais de 100.000 polígonos para subdividir; nesse ponto, não era possível nem fazer 2 ou 3 níveis de subdivisão sem diminuir o ritmo. Simplificando, ele escreveu um código super otimizado para tamanhos de entrada irrealisticamente pequenos que não
Você precisa otimizar os casos de uso reais alinhados aos interesses dos usuários, ou isso é pior do que inútil, pois todas as otimizações que tendem a degradar a manutenção do código têm um pouco de benefício para o usuário e apenas todos os negativos para a base de código.