Onde trabalhei, sempre usamos vários níveis de criação de perfil; se você encontrar um problema, basta mover a lista um pouco mais até descobrir o que está acontecendo:
- O "profiler humano", também conhecido como apenas jogar o jogo ; sente lento ou "engate" ocasionalmente? Notando animações espasmódicas? (Como desenvolvedor, observe que você será mais sensível a alguns tipos de problemas de desempenho e alheio a outros. Planeje testes extras de acordo.)
- Ligue a tela do FPS , que é um FPS médio de 5 segundos na janela deslizante. Muito pouca sobrecarga para calcular e exibir.
- Ligue as barras de perfil , que são apenas uma série de quads (cores ROYGBIV) que representam diferentes partes do quadro (por exemplo, vblank, preframe, atualização, colisão, renderização, pós-quadro) usando um simples cronômetro "cronômetro" em cada seção do código . Para enfatizar o que queremos, definimos uma barra de largura de tela como representativa de um quadro de destino de 60Hz, para que seja realmente fácil ver se você está, por exemplo, com 50% abaixo do orçamento (apenas meia barra) ou 50% acima ( a barra envolve e se torna uma barra e meia). Também é muito fácil dizer o que geralmente está comendo a maior parte do quadro: red = render, yellow = update, etc ...
- Crie uma compilação instrumentada especial que insira "cronômetro" como código em todas as funções. (Observe que você pode ter um desempenho massivo, dcache e icache atingido ao fazer isso, por isso é definitivamente intrusivo. Mas se você não tiver um perfil de amostragem adequado ou um suporte decente na CPU, essa é uma opção aceitável. Você também pode ser inteligente sobre como gravar um mínimo de dados na função, entrar / sair e reconstruir rastros de chamadas posteriormente.) Quando criamos o nosso, imitamos grande parte do formato de saída do gprof .
- O melhor de tudo, execute um criador de perfil de amostragem ; O VTune e o CodeAnalyst estão disponíveis para x86 e x64; você tem vários ambientes de simulação ou emulação que podem fornecer dados aqui.
(Há uma história divertida da GDC do ano passado de um programador gráfico que tirou quatro fotos de si mesmo - feliz, indiferente, irritado e irritado - e exibiu uma imagem apropriada no canto das construções internas com base na taxa de quadros. os criadores de conteúdo aprenderam rapidamente a não ativar shaders complicados para todos os seus objetos e ambientes: eles irritariam o programador. Veja o poder do feedback.)
Observe que você também pode fazer coisas divertidas, como representar graficamente as "barras de perfil" continuamente, para ver padrões de pico ("estamos perdendo um quadro a cada 7 quadros") ou algo semelhante.
Porém, para responder sua pergunta diretamente: na minha experiência, embora seja tentador (e geralmente gratificante - geralmente aprendo algo) reescrever funções / módulos únicos para otimizar o número de instruções ou o desempenho do icache ou dcache, e realmente precisamos fazer Às vezes, quando temos um problema de desempenho particularmente desagradável, a grande maioria dos problemas de desempenho com os quais lidamos regularmente se resume ao design . Por exemplo:
- Devemos armazenar em cache na RAM ou recarregar do disco os quadros de animação de estado de "ataque" para o player? Que tal para cada inimigo? Não temos RAM para fazer tudo, mas as cargas de disco são caras! Você pode ver o engate se 5 ou 6 inimigos diferentes aparecerem ao mesmo tempo! (Ok, que tal desova impressionante?)
- Estamos realizando um único tipo de operação em todas as partículas ou todas as operações em uma única partícula? (Essa é uma troca do icache / dcache, e a resposta nem sempre é clara.) Que tal separar todas as partículas e armazenar as posições juntas (a famosa "estrutura de matrizes") versus manter todos os dados de partículas em um só lugar (" matriz de estruturas ").
Você o ouve até que se torne desagradável em qualquer curso de ciência da computação em nível universitário, mas: é realmente tudo sobre estruturas e algoritmos de dados. Passar algum tempo com o design de algoritmos e fluxo de dados vai lhe trazer mais benefícios em geral. (Certifique-se de ler os excelentes slides das Armadilhas da Programação Orientada a Objetos de um membro dos Serviços de Desenvolvedor da Sony para obter algumas dicas aqui.) Isso não parece otimização; é na maior parte do tempo gasto com um quadro branco ou ferramenta UML ou criando muitos protótipos, em vez de tornar o código atual mais rápido. Mas geralmente vale muito mais a pena.
E outra heurística útil: se você estiver próximo do "núcleo" do seu mecanismo, pode valer algum esforço e experimentação extra para otimizar (por exemplo, vetorizar essas matrizes multiplica!). Quanto mais longe do núcleo, menos você deve se preocupar com isso, a menos que uma de suas ferramentas de criação de perfil diga o contrário.