Prévia do material em texto
<p>Estruturas de Dados</p><p>Professores: Gisele L Pappa</p><p>Wagner Meira Jr</p><p>Depuração de Desempenho do</p><p>TAD Matriz</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>gprof é uma ferramenta para análise dinâmica (diferente</p><p>da análise estática) da execução de programas.</p><p>O propósito usual desse tipo de análise é determinar o</p><p>quanto de recurso computacional é consumido por cada</p><p>parte do código, com o objetivo de otimizar o tempo de</p><p>execução e diminuir quando possível o consumo de</p><p>memória.</p><p>Essa ferramenta pode ser usada em conjunto com o gcc.</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Uso do gprof:</p><p>1. Compile todos os módulos com a opção -pg</p><p>2. Execute o programa, o que gera um arquivo gmon.out</p><p>3. Execute o gprof:</p><p>gprof gmon.out > /tmp/analise.txt</p><p>4. Verifique o arquivo /tmp/analise.txt</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Perfil raso:</p><p>% cumulative self self total</p><p>time seconds seconds calls s/call s/call name</p><p>63.33 1.17 1.17 1 1.17 1.80 multiplicaMatrizes</p><p>21.11 1.56 0.39 251000000 0.00 0.00 leMemLog</p><p>12.72 1.80 0.24 126500000 0.00 0.00 escreveMemLog</p><p>2.44 1.84 0.05 3 0.02 0.02 defineFaseMemLog</p><p>0.54 1.85 0.01 4 0.00 0.00 inicializaMatrizNula</p><p>0.00 1.85 0.00 4 0.00 0.00 acessaMatriz</p><p>0.00 1.85 0.00 4 0.00 0.00 criaMatriz</p><p>0.00 1.85 0.00 3 0.00 0.00 destroiMatriz</p><p>0.00 1.85 0.00 2 0.00 0.00 inicializaMatrizAleatoria</p><p>0.00 1.85 0.00 1 0.00 0.00 clkDifMemLog</p><p>0.00 1.85 0.00 1 0.00 0.00 desativaMemLog</p><p>0.00 1.85 0.00 1 0.00 0.00 finalizaMemLog</p><p>0.00 1.85 0.00 1 0.00 0.00 iniciaMemLog</p><p>0.00 1.85 0.00 1 0.00 0.00 parse_args</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Grafo de execução</p><p>index % time self children called name</p><p>[1] 100.0 0.00 1.85 main [1]</p><p>1.17 0.62 1/1 multiplicaMatrizes [2]</p><p>0.05 0.00 3/3 defineFaseMemLog [5]</p><p>0.00 0.01 2/2 inicializaMatrizAleatoria [7]</p><p>0.00 0.00 1/4 inicializaMatrizNula [6]</p><p>0.00 0.00 4/4 acessaMatriz [8]</p><p>0.00 0.00 3/4 criaMatriz [9]</p><p>0.00 0.00 3/3 destroiMatriz [10]</p><p>0.00 0.00 1/1 parse_args [15]</p><p>0.00 0.00 1/1 iniciaMemLog [14]</p><p>0.00 0.00 1/1 desativaMemLog [12]</p><p>0.00 0.00 1/1 finalizaMemLog [13]</p><p>-----------------------------------------------</p><p>1.17 0.62 1/1 main [1]</p><p>[2] 97.0 1.17 0.62 1 multiplicaMatrizes [2]</p><p>0.39 0.00 250000000/251000000 leMemLog [3]</p><p>0.23 0.00 125000000/126500000 escreveMemLog [4]</p><p>0.00 0.00 1/4 inicializaMatrizNula [6]</p><p>0.00 0.00 1/4 criaMatriz [9]</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Análise do matop:</p><p>Mesmo desabilitadas, a simples invocação das funções</p><p>leMemLog e escreveMemLog para retornarem</p><p>imediatamente causa degradação de desempenho</p><p>Uma solução nesse caso é fazer o teste numa macro:</p><p>#define LEMEMLOG(pos,tam,id) \</p><p>((void)((ml.ativo==MLATIVO)?leMemLog(pos,tam,id):0))</p><p>#define ESCREVEMEMLOG(pos,tam,id) \</p><p>((void) ((ml.ativo==MLATIVO)?escreveMemLog(pos,tam,id):0))</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Perfil raso:</p><p>% cumulative self self total</p><p>time seconds seconds calls ms/call ms/call name</p><p>100.14 0.69 0.69 1 690.95 690.95 multiplicaMatrizes</p><p>0.00 0.69 0.00 4 0.00 0.00 acessaMatriz</p><p>0.00 0.69 0.00 4 0.00 0.00 criaMatriz</p><p>0.00 0.69 0.00 4 0.00 0.00 inicializaMatrizNula</p><p>0.00 0.69 0.00 3 0.00 0.00 defineFaseMemLog</p><p>0.00 0.69 0.00 3 0.00 0.00 destroiMatriz</p><p>0.00 0.69 0.00 2 0.00 0.00 inicializaMatrizAleatoria</p><p>0.00 0.69 0.00 1 0.00 0.00 clkDifMemLog</p><p>0.00 0.69 0.00 1 0.00 0.00 desativaMemLog</p><p>0.00 0.69 0.00 1 0.00 0.00 finalizaMemLog</p><p>0.00 0.69 0.00 1 0.00 0.00 iniciaMemLog</p><p>0.00 0.69 0.00 1 0.00 0.00 parse_args</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Depuração de Desempenho: gprof</p><p>Grafo de execução</p><p>index % time self children called name</p><p>0.690.00 1/1 main [2]</p><p>[1] 100.0 0.690.00 1 multiplicaMatrizes [1]</p><p>0.000.00 1/4 criaMatriz [4]</p><p>0.000.00 1/4 inicializaMatrizNula [5]</p><p>-----------------------------------------------</p><p>[2] 100.0 0.000.69 main [2]</p><p>0.690.00 1/1 multiplicaMatrizes [1]</p><p>0.000.00 4/4 acessaMatriz [3]</p><p>0.000.00 3/3 defineFaseMemLog [6]</p><p>0.000.00 3/4 criaMatriz [4]</p><p>0.000.00 3/3 destroiMatriz [7]</p><p>0.000.00 2/2 inicializaMatrizAleatoria [8]</p><p>0.000.00 1/1 parse_args [13]</p><p>0.000.00 1/1 iniciaMemLog [12]</p><p>0.000.00 1/1 desativaMemLog [10]</p><p>0.000.00 1/4 inicializaMatrizNula [5]</p><p>0.000.00 1/1 finalizaMemLog [11]</p><p>Estruturas de Dados – 2021-2</p><p>Pappa & Meira Jr.</p><p>Resultados matop: gnuplot perf.gp</p><p>Estruturas de Dados</p><p>Professores: Gisele L Pappa</p><p>Wagner Meira Jr</p><p>Depuração de Desempenho do</p><p>TAD Matriz</p>