Este tutorial descreve o Gprof (GNU Profiler) e como utilizá-lo para determinar quais partes de um programa estão consumindo mais tempo de execução. A ferramenta Gprof permite a análise da performance de um programa e exibe esses resultados em duas tabelas mostrando o consumo de tempo e um grafo dos métodos/funções analisados.

Renato Stoffalette Joao, Software Enginner, IBM

Renato Stoffalette Joao é Engenheiro de Software no Linux Technology Center (LTC) da IBM Brasil. Seu trabalho no LTC consiste em interações com diversas comunidades de código aberto Linux e desenvolvimento de extensões da plataforma Eclipse IDE usando a linguagem Java. É bacharel em Ciência da Computação pela Universidade Estadual Paulista (UNESP) e mestrando pela Universidade Federal do ABC (UFABC). Perfil My developerWoks.



18/Set/2012

Introdução ao Gprof

A ferramenta Gprof [1] é uma ferramenta do projeto GNU que faz parte do conjunto de ferramentas binárias GNU Binutils [2]. Ela permite a análise dinâmica de programas binários através da coleta de informações e identificação de trechos de código mais constantemente solicitados por um programa em execução, além do tempo consumido por cada rotina de um programa.

Este tipo de informação permite analisar a quantidade de métodos (ou funções) existentes no código, bem como o número de chamadas de cada método e a porcentagem de tempo gasto para executar cada método ou função.

Esta informação é relevante, pois mostra quais partes do programa estão demorando para serem executadas ou quais partes estão sendo executadas mais ou menos vezes do que era esperado.

Com este tipo de informação é possível aplicar técnicas de otimização para melhorar a performance de seu programa.


Executando o Gprof

Antes de executar o Gprof é preciso compilar o programa em análise, apropriadamente, para produzir informações a serem futuramente interpretadas pelo Gprof.

Essencialmente, o código-fonte precisa ser compilado com a opção de profiling habilitada.

Para habilitar esta opção, adicione as flags -pg ao processo de compilação.

Veja por exemplo para compilar um código-fonte em C utilizando o GCC (Gnu Compiler Collection).

#gcc -pg codigo_fonte.c –o programa

Este comando irá compilar seu código-fonte e criar um programa executável capaz de produzir as informações necessárias para sua análise com o Gprof.

Após a compilação, seu programa pode ser executado, pois somente após a execução será possível obter informações sobre o tempo consumido pelos métodos e rotinas do seu programa.

Como se observa, seu programa deve ser executado naturalmente como de costume e produzir as saídas normalmente esperadas, além de criar um arquivo chamado gmon.out caso termine sem erros.

O arquivo gmon.out é criado dentro do diretório onde projeto está localizado por padrão, mas caso já exista um arquivo com o mesmo nome, ele será reescrito.

Depois de criado o arquivo gmon.out, você pode executar o Gprof para interpretar suas informações, tal como é demonstrado na sequência.

Os resultados desta interpretação serão impressos na saída padrão, então pode ser uma boa idéia gravar os resultados para um arquivo utilizando o símbolo de redirecionamento '>'. Assim, fica mais fácil para futuramente analisar suas informações e manter registros dos resultados.

Consulte [3] para opções extras que podem ser adicionadas a este comando.

# gprof OPÇÕES [executavel [gmon.out]]  > [ARQUIVO]

O resultado deste procedimento é um arquivo contendo duas tabelas.

Este arquivo pode ser aberto em qualquer editor de textos.

Uma destas tabelas é chamada flat profile e a outra é chamada call graph.

A tabela flat profile mostra informações sobre o tempo que o programa gastou em cada método ou rotina e quantas vezes aquela rotina foi executada.

A tabela call graph mostra informações no formato de um grafo direcionado acíclico. Para maiores informações sobre grafos direcionados acíclicos consulte [4] e [5 ].

Este grafo mostra, para cada método, quais métodos o invocaram, quais métodos invocou e quantas vezes foi executado. Há ainda uma estimativa de quanto tempo foi gasto nas sub rotinas de cada um desses métodos.

Este tipo de informação pode sugerir locais, em seu código-fonte, onde você pode eliminar chamadas de funções que gastam muito tempo.


Interpretando os Resultados

Assim como dito anteriormente, os resultados da execução do Gprof estão dispostos em duas tabelas.

Uma destas tabelas, denominada flat profile, exibida na Figura 1, mostra a percentagem de tempo que um programa com alguns métodos de ordenação de vetores gasta em cada um dos seus métodos.

Note que podem ocorrer casos de métodos com nenhum tempo aparentemente gastos, e que não serão apresentados nesta tabela.

Caso queria que todos os métodos sejam mostrados nesta tabela, utilize a opção -z no campo de OPÇÕES quando for executar o Gprof.

Observe que os métodos são ordenados de forma decrescente de acordo com o tempo gasto por eles. E os campos de cada coluna tem os seguintes significados :

  • %time - Indica a percentagem de tempo de execução gasto por método.
  • cumulative seconds - É o tempo gasto por um método acrescido do tempo gasto pelos métodos anteriores na tabela.
  • self seconds - Mostra o tempo gasto em segundos por método.
  • calls - Mostra o número de de vezes que um método foi chamado.
  • self s/ call - Representa o tempo em segundos gastos em um método para cada chamada.
  • total s/ call – Mostra o tempo gasto em segundos por um método e suas sub-rotinas.
  • name - Identificação do nome do método ou rotina

Figura 1: Exemplo de uma tabela flat profile

A outra tabela de informações gravadas na saída do resultado da execução do Gprof é denominada call graph.

Esta tabela exibe a quantidade de tempo gasto em cada método e suas sub-rotinas, na forma de um grafo direcionado acíclico.

A Figura 2 mostra um exemplo parcial da tabela para o mesmo programa com métodos de ordenação de vetores.

Os campos desta tabela tem os seguintes significados:

  • index – Representa um índice para cada método ou rotina analisada.
  • %time – Indica a percentagem de tempo gasto pelo método e por suas sub rotinas.
  • self – Representa o tempo gasto pelo método.
  • children – Representa o tempo gasto pelos “filhos” de um método.
  • called – Indica o número de vezes que este método foi chamada.
  • name – Representa o nome do método analisado.

Figura 2: Exemplo parcial de uma tabela call graph


Conclusão

Com o Gprof é possível fazer análise do tempo consumido pelos métodos ou rotinas de qualquer programa executável criado em um ambiente Linux.

As informações sobre o tempo consumido pelas rotinas do seu programa são muito valiosas pois podem apontar possíveis bugs ou trechos de código que podem ser reescritos para otimizar o desempenho do seu programa.


REFERÊNCIAS

[1] GNU Gprof. Retirado em Junho de 2012.
http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

[2] GNU Binutils. Retirado em Junho de 2012.
http://www.gnu.org/software/binutils/

[3] Manual Online do Gprof. Retirado em Junho de 2012.
ftp://ftp.gnu.org/pub/old-gnu/Manuals/gprof/html_chapter/gprof_4.html#SEC4

[4] Ryder, B.G., "Constructing the Call Graph of a Program," Software Engineering, IEEE Transactions on, vol. SE-5, no.3pp. 216- 226, May 1979.

[5] Grove, D., DeFouw, G., Dean, J., and Chambers, C. 1997. Call graph construction in object-oriented languages. SIGPLAN Not. 32, 10 (Oct. 1997), 108-124.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=835833
ArticleTitle=Introdução ao GPROF
publish-date=09182012