Pergunta

Algumas das plataformas que se desenvolvem na, não têm ferramentas de perfil. Eu estou procurando sugestões / técnicas que você pessoalmente tenho usado para ajudar a identificar hotspots, sem o uso de um gerador de perfil.

A língua de destino é C ++.

Estou interessado no que você usou pessoalmente.

Foi útil?

Solução

Eu encontrei o seguinte bastante útil:

#ifdef PROFILING
# define PROFILE_CALL(x) do{ \
    const DWORD t1 = timeGetTime(); \
    x; \
    const DWORD t2 = timeGetTime(); \
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \
  }while(false)
#else
# define PROFILE_CALL(x) x
#endif

Que pode ser usado na função de chamada como tal:

PROFILE_CALL(renderSlow(world));
int r = 0;
PROFILE_CALL(r = readPacketSize());

Outras dicas

Não é brincadeira: Além de despejo horários para std :: cout e outro texto / dados orientados aproxima Eu também uso a função Beep (). Há algo sobre ouvir a lacuna de silêncio entre dois postos de controle "bip" que faz com que um tipo diferente de impressão.

É como a diferença entre olhar para a partitura escrita, e realmente ouvir a música. É como a diferença entre a leitura rgb (255,0,0) e vendo vermelho-fogo.

Então, agora, eu tenho um aplicativo cliente / servidor e com sinais sonoros de diferentes freqüências, marcando onde o cliente envia a mensagem, onde o servidor começa a sua resposta, termina sua resposta, em que responder primeiro entra o cliente, etc, Eu posso muito naturalmente ter uma idéia de onde o tempo é gasto.

Em essência, se uma ferramenta de análise não estiver disponível, você emular o que um profiler teria feito. Você inserção contadores em funções você acha que são interessantes e contar quantas vezes, e potencialmente com o tamanho / tipo de argumentos que eles são chamados.

Se você tem acesso a todos os temporizadores em sua plataforma, você pode iniciar / parar estes no início / fim das referidas funções para obter informações em tempo de execução, bem como, se este não é clara a partir do código. Isso vai lhe dar o maior retorno para seus investimentos em código complexo, como normalmente haverá muitas funções para instrumento de todos eles. Em vez disso, você pode obter o tempo gasto em determinadas seções de código, dedicando um temporizador para cada um.

Estas duas técnicas em conjunto podem formar uma abordagem iterativa, onde você encontra uma ampla seção de código que consome a maior parte de seus ciclos usando temporizadores, então instrumento funções individuais em uma granularidade para aprimorar no problema.

Se é algo suficientemente longo de duração (por exemplo, um minuto ou mais), eu executar o software em um depurador, em seguida, quebrar algumas vezes e ver onde as quebras de depurador, o que dá uma ideia muito aproximada do que o software está para (por exemplo, se você quebrar 10 vezes e todos eles estão no mesmo lugar, isto diz-lhe algo interessante!). Muito áspera e pronto, mas não requer quaisquer ferramentas, instrumentação etc.

Eu não tenho certeza que as plataformas que você tinha em mente, mas em microcontroladores embutidos, às vezes é útil para mexer uma linha de saída digital de reposição e medir a largura de pulso usando um osciloscópio, contador / timer, ou analisador lógico.

Gostaria de usar a regra 80/20 e colocar temporizadores ao redor hotspots ou caminhos de chamada interessantes. Você deve ter uma idéia geral onde os gargalos vai ser (ou pelo menos a maioria dos caminhos de execução) e usar a plataforma apropriada temporizador de alta resolução dependente (QueryPerformanceCounters, gettimeofday, etc.).

Eu normalmente não se preocupar com qualquer coisa na inicialização ou desligamento (a menos que necessário) e vai ter bem definido "pontos de estrangulamento", geralmente passagem de mensagens ou algum tipo de cálculo algorítmico. Eu geralmente descobriu que pias de mensagens / SRCs (pias Moreso), filas, semáforos, e bagunça-ups apenas simples (algoritmos, loops) geralmente respondem pela maior parte a latência em um caminho de execução.

Você está usando o Visual Studio?

O que você pode usar o / Gh e / GH muda. Aqui está um exemplo que envolve inspeção da pilha

Esses sinalizadores permitem, por uma base arquivo por arquivo, para registrar funções undecorated que são chamados cada vez que um método é introduzido e / ou deixado em tempo de execução.

Você pode então registrar todos os momentos de informações de perfil, não apenas informações de cronometragem. Stack-lixeiras, chamando endereço, endereço do remetente, etc. O que é importante, porque você pode querer saber que 'função X utilizado tempo Y sob a função Z' e não apenas o tempo total gasto na função X.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top