Criação de perfil de um processo (possivelmente vinculado a E / S) para reduzir a latência

Eu quero melhorar o desempenho de um método específico dentro de um aplicativo maior.

O objetivo é melhorar a latência (tempo de relógio de parede gasto em uma função específica), não (necessariamente) o carregamento do sistema.

Requisitos:

Como espero que a latência seja devida a E / S, leve em consideração o tempo gasto em espera / bloqueado (em outras palavras: observe a hora do relógio de parede em vez do tempo de CPU)Como o programa faz muito mais do que o fragmento que estou tentando otimizar. É necessário que haja uma maneira de iniciar / parar a criação de perfil programaticamente ou filtrar a saída para mostrar apenas o tempo entre a entrada e a saída da função que estou otimizando.A criação de perfil no nível do método é aceitável (se isso puder ser feito no nível de instrução, melhor ainda. Se ela só faz o perfil de chamadas do sistema, provavelmente não é suficiente)Isto é para um projeto de hobby, ferramentas tão caras não são realmente uma opçãoInstrumentação (-finument-functions) é aceitávelA parte crítica do código em que estou interessado é difícil de ser interrompida manualmente (porque já é relativamente rápido e difícil de invocar realisticamente em um loop), portanto, algum tipo de automação é necessário.

Ferramentas descartadas até agora:

gprof, oprofile, callgrind (requisito 1)buiding algo personalizado usando getrusage (requisito 1)poormansprofiler.org (requisito 2)strace -T, dtrace,http://perf.wiki.kernel.org (requisitos 2 e 3)VTune, Zoom (requisito 4)amostragem de pilha de chamadas manual (requisito 6)google-perftools (deve ser capaz de medir o tempo de parede, mas isso não parece funcionar no meu caso, presumivelmente porque a interferência SIGALRM.systemtap (meu kernel não está corrigido para incluir o utrace)

Outras opções que ainda não avaliei ainda:

cprof (não constrói aqui fora da caixa, parece apenas i386)inserindo manualmente pontos de rastreio (por exemplo, com lttng)

Eu adoraria ouvir sobre:

outras opçõestalvez eu tenha descartado alguma ferramenta cedo demais?se as opções que eu não avaliei ainda têm uma chance de funcionar e, em caso afirmativo, como melhor fazê-lo.

Eu finalmente me decidi por:

construindo algo personalizado usando -finstrument-functions eu mesmo, com base emhttp://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

O traço produzido por essa ferramenta crua é difícil de interpretar, e posso facilmente imaginar algumas ferramentas para processar ainda mais sua saída, tornando-a infinitamente mais útil. No entanto, isso fez o trabalho para mim por agora, então eu estou colocando esse projeto fora até mais tarde;).

questionAnswers(3)

yourAnswerToTheQuestion