Estamos trabalhando em uma base de código C ++ de tamanho médio (10Mloc) que, através de nossos esforços de otimização, está se tornando uniformemente lenta .
Essa base de código é um conjunto de bibliotecas que combinamos para colocá-las em funcionamento. Quando a estrutura geral de como essas bibliotecas se comunicam foi desenvolvida, houve alguma ênfase no desempenho e, posteriormente, quando mais partes foram adicionadas, a estrutura geral não mudou muito. A otimização foi feita quando necessário e à medida que nosso hardware evoluiu. Isso tornou a decisão precoce cara aparente apenas muito mais tarde. Agora estamos em um ponto em que novas otimizações são muito mais caras, pois exigiriam reescrever grandes partes da base de código. Nos vemos chegando a um mínimo local indesejável, pois sabemos que, em princípio, o código deve ser capaz de rodar muito mais rápido.
Existem metodologias bem-sucedidas que ajudam a decidir o que significa assumir a evolução de uma base de código em direção a uma solução com desempenho global ideal, que não é facilmente confundida por oportunidades fáceis de otimização?
EDITAR
Para responder à pergunta de como perfilamos atualmente:
Realmente temos apenas dois cenários diferentes de como esse código pode ser usado, ambos embaraçosamente paralelos. A criação de perfil é feita com o tempo médio do relógio de parede em uma grande amostra de entradas e execuções mais detalhadas (custos de instrução, previsões incorretas de ramificação e problemas de armazenamento em cache). Isso funciona bem, já que rodamos exclusivamente em nossas máquinas extremamente homogêneas (um conjunto de algumas milhares de máquinas idênticas). Como geralmente mantemos todas as nossas máquinas ocupadas a maior parte do tempo funcionando mais rápido, podemos observar outras coisas novas. É claro que o problema é que, quando novas variações de entrada aparecem, elas podem sofrer uma penalidade tardia, pois removemos as micro-ineficiências mais óbvias para os outros casos de uso, diminuindo assim o número de cenários de "execução ideal".
sloc
. Eu o chamei de "tamanho moderado" porque não tenho idéia do que é considerado "grande" aqui.