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.
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.
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
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.
[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.
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.