Análise de performance

Monday, May 4, 2009
By Augusto Pascutti

Me perguntaram como realmente se pode medir o desempenho de uma aplicação PHP, que tipo de classe ou ferramenta eu utilizava para fazer isso, foi então que uma pessoa me mostrou um artigo encontrado em um site respeitável na internet: Benchmarking de Aplicações PHP.

Eu não canso de ficar “de cabelo em pé” com as coisas que eu leio, principalmente na internet. Uma coisa que devemos aprender é a questionar as coisas que lemos, a internet é de domínio público. Eu posso – por exemplo – escrever um artigo sobre como fazer inseminação artificial! Seria tão ruim quanto o artigo que eu citei?! Difícil…

Vamos aos fatos. Nosso mundo é o mundo do desenvolvimento! Pro inferno com a fábrica da Coca-Cola, de Dadinhos de Amendoim e de Muppy. Quase nada que é válido pra eles é válido para o “nosso mundo”, por que insistir em querer replicar coisas que funcionam na administração de empresas em desenvolvimento de software? A resposta é simples: é muito mais fácil repetir do que pensar! Vamos analisar todos os erros do artigo, e ver como realmente medir a performance de uma aplicação.

Profiling x Benchmark

O ato de medir a performance de uma aplicação é conhecido como profiling, já benchmark é utilizado para medir a performance relativa da aplicação. benchmark é utilizado para medir o desempenho de uma aplicação em diferentes ambientes, fazem isso através de testes genéricos pré-definidos e os dados que resultam dos testes não dizem nada a respeito da aplicação, eles só são úteis se você possui outros resultados para usar de base de comparação.

Já o resultado de um profiling é absoluto. Através deste resultado você sabe em que parte do seu código estão os gargalos e os possíveis gargalos futuros. Quando se está analisando problemas de performance, o profiling é a base de todas as ações que você vai tomar enquanto que o benchmak existe para resolver problemas mais específicos.

No artigo o autor não deixa isso explícito e é extremamente fácil confundir benchmark e profiling. Medir um algoritmo contra outro (como ele fez) é benchmark, medir a performance da aplicação para saber onde ela demora mais é profiling!

Regra Número um de Análise de Performance

Agora sim as coisas ficam um pouco parecidas com o mundo real: como um cientista, no momento de analisar qualquer coisa, você não assume nada. Nada! Esse é o primeiro erro que você pode cometer e todo mundo comete. Para assumir qualquer postura em relação a algo, você precisa ter argumentos. Que argumento é mais convincente do que o resultado de um teste?!

Ferramentas de Benchmark

Quantos de nós usamos o Apache Httpd?! Praticamente todos! Pois então, o Apache Httpd vêm com uma ferramenta imbutida de benchmark muito boa, o “ab” ou “Apache Benchmark”. Com ela você consegue executar testes de chamada a uma determinada URL especificando o número de requisições que você deseja simular, o número de requisições simultâneas e depois comparar os dados. Eis os dados de comparação entre algumas ferramentas de cache em PHP.

Sem Zend Optimizer Com Zend Optimizer
PHP Raw (Puro) 59 70
APC 102 -
eAccelerator 99 125
xCache 109 125

Usar o “ab” é bem trivial, um simples “ab –help” é autoexplicativo e você não terá dificuldades em examinar os resultados.

Ferramentas de Profiling

Existe um formato bem conhecido de resultado de profiling chamado “CacheGrind”. É bem comum que ferramentas de profling (independente da linguagem) gerem um resultado em formato CacheGrind, o que aos olhos humanos é um terror, mas que com um programa de leitura fica muito melhor.

Portanto temos duas etapas: gerar um arquivo CacheGrind e analisá-lo. Gerar é fácil, você pode usar o xDebug para fazer isso. O Xdebug, se configurado para, irá gerar um arquivo CacheGrind sempre que uma página for executada. Se nunca usou o xDebug aconselho começar a usar, ele ajuda muito no desenvolvimento além de ser uma ótima ferramenta de profiling.

Para analisar o arquivo gerado temos diversas opcões para diferentes sistemas operacionais. A que eu mais gosto? Webgrind! Você instala ele e pronto. Nada de ficar acostumando com interface que depende do S.O. nem sentir falta de alguma funcionalidade! O WebGrind é bom o suficiente pra substituir qualquer ferramenta de análise CacheGrind desde que o arquivo de análise não seja muito grande. “Mas o que eu posso ver?” deve estar se perguntando.

Através do CacheGrind podemos saber quantas vezes determinada função, arquivo ou método foi executado; quando ele foi executado e quanto tempo demorou cada execução. Podemos ver isso em diversos níveis e em diversas ordens. Isso facilita a análise de gargalos na sua aplicação e direciona seu esforço nesses gargalos e não em suposições.

Performace x Manutenção de Código

Isso é algo que gera controvérsia, mas é muito simples. Tudo o que vimos neste post está relacionado a performance. Benchmark e profilling servem de ferramentas para ajudar a melhorar a performance de sua aplicação, elas por si só não fazem nada. Mas sem elas, você provavelmente não fará nada muito útil nessa área também.

Tenha como prioridade a manutenção de seus códigos! Vamos repetir isso mais uma vez: tenha como prioridade a manutenção dos seus códigos. Esqueça a performace de início. Peformance em último caso se resolve com hardware, manutenção não tem preço que pague nem reza que resolva.

O artigo cita, por exemplo. Trocar objetos por array torna uma aplicação mais rápida? Torna. A pergunta pertinente que deveria ser feita é: a que custo?

Você não vai precisar deixar de usar objetos em sua aplicação, o benefício é mínimo em termos de performance pra perda que você tem na manutenção do código. Dificilmente para qualquer um de nós essa troca chegue a trazer algum benefício! Por esse motivo eu critiquei tanto o artigo no início desse post. O autor foi infeliz na comparação e na conclusão.

Chega de usar PHP como uma linguagem qualquer. Ela evoluiu a muito tempo! Se você se considera um programador, evolua junto com ela! Sem mais “echo” para debug, sem mais “microtime()” para medir desempenho! Estudem, testem, pratiquem, cheguem às suas próprias conclusões!

Conclusões

Não darei nenhuma conclusão aqui, já os incitei o suficiente. Testem o que foi mostrado nesse post em suas aplicações ou seus blogs e cheguem a suas própria conclusões. Uma coisa que não citei no decorrer do post, mas acho importante, é que não existe como chegar a uma conclusão a partir de um único teste. Tenha seu “rol” de dados e a partir dele obtenha suas conclusões.

Eu fui bem duro nas críticas ao artigo citado por um motivo. Se o intuito é ensinar alguma coisa, se preocupe com as coisas que você passa. Pessoas lerão e usarão aquilo em seu dia a dia. Respeito muito as pessoas que passam o conhecimento adiante, mas isso deve ser feito com cuidado. Sugerir indiretamente ao público leitor que arrays são mais rápidos que objetos mostrando uma diferença numérica em um caso hipotético de forma isolada é prejudicial, a impressão que se tem ao final do artigo é de que não devemos usar objetos pois eles irão deixar nossas aplicações lentas, quando provavelmente (pra não dizer certamente) os objetos nunca serão os culpados pela lentidão da sua aplicação.

Augusto Pascutti

Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.

Website - More Posts

Tags: ,

  • João Paulo

    Parabéns pelo artigo, muito profissional. Infelizmente existe muita gente que usa fóruns e portais de conteúdo apenas para se promover ou promover sua empresa, escrevem qualquer coisa apenas para aparecer, sem se preocupar em transmitir conhecimento e experiência profissional.

  • http://toscano.com.br marcelo toscano

    Foi por isso que eu parei de ler muita coisa por ai e quando eu leio procuro selecionar muito bem de onde.

    Além disso, sites como iMastes são bacanar, mas é um clássico exemplo de que, quantidade não é a igual a qualidade.

    Parabéns Augusto, no começou do artigo devo confessar que achei ruim a maneira que você começou, mas no final eu concordo planamente com você.

    Gratz

  • http://toscano.com.br marcelo toscano

    aff … escrevi tudo errado lol

  • Ari

    Avaliar o que é útil é de extrema importância para a evolução do conhecimento. Parabéns pelo post.

  • http://www.igorescobar.com/blog/ Igor Escobar

    Muito ético da sua parte se referir assim diretamente à minha pessoa, gostei. Você pode dizer que eu possa ter confundido algo ou misturado algo durante o artigo ou ter me expressado de maneira que fique vago algum conceito mas dizer que o que eu ressaltei no artigo é algo que não se deve confiar ou simplesmente jogar no lixo é muio estrelismo de sua parte ;)

  • http://www.igorescobar.com/blog/ Igor Escobar

    De qualquer maneira, eu apenas ressaltei no artigo UMA forma de se fazer “BENCHMARKING” de código (como diz o título) de forma simples e que funciona. Não entendi o real motivo dessa sua raiva com relação ao que eu escrevi… ou você não entendeu o que eu escrevi ou você nem se deu o trabalho de ler o que foi escrito…. enfim…. De qualquer forma, foi um prazer ler o que você pensa.

  • http://www.ivanrosolen.com/ Ivan Rosolen

    O artigo do outro site é muito bom! huahauhauahu

    Veja a conclusão “Trabalhar com arrays é mais lento do que trabalhar com arrays.”

    E um loop com 10000 repetições….uau! Isso que é um ótimo exemplo de “Benchmarking”

  • http://www.iw2servers.com.br Joao Vagner

    Igor,

    Em termos de comparacao seu artigo foi falho, e devidamente houve correcoes do Augusto nas questoes aplicadas no seu artigo.

    Em questao, seu artigo apresenta falhas graves, e no momento em que postou aqui, dizendo que nao entende a raiva, sao por motivos obvios que nao percebeu na leitura do decorrer do artigo do Augusto, que e mostrar a real clareza de se obter testes e como fazer testes que sejam realmente substanciais, nao baseados em loops de arrays e afins.

    Todos da comunidade esperam pelo menos um pouco de cautela quando liberar um artigo, pois o amadurecimento do php conta com o amadurecimento de seus colaboradores e escritores. E lancar artigo com informacoes erradas e falhas nao ajuda em mostrar a qualidade e os avancos do PHP.

    Fico triste por perceber que ao receber uma resposta a algo que nao condiz com a verdade, as pessoas fiquem bravas, irritadas ao inves de aprender e mandar correcoes ou um novo artigo com informacoes reais e validas.

  • http://www.augustopascutti.com Augusto Pascutti

    Igor,

    Eu li sim seu artigo até o final e mais de uma vez, vc aparentemente não leu este até o final. Como eu disse, é louvável que as pessoas passem o conhecimento adiante. Desde que esse conhecimento seja válido. Sinceramente …. pelo que eu vi em seu blog, você é capaz de muito mais que isso.

    Se fosse só o caso do microtime(), mas o exemplo que você usou simplismente instiga as pessoas a não suar objetos, quando você como desenvolvedor e divulgador da linguagem deveria fazer exatamente o contrário !

    Ninguém é perfeito, como disse – sem sarcasmo nenhum – é louvável quando as pessoas tentam passar pra frente o que sabem. Mas faça isso com mais cuidado. Você é responsável por formar profissionais, ajude-os de forma mais sensata num futuro.

    Eu já estou acostumado a me arrepender de como me expresso ao criticar alguma coisa, peço desculpas (pela prieira vez a você, pela enésima a quem me conhece) por eu ter sido tão rude e direto, mas não retiro minhas posições mencionadas nem ensse comentário nem no post.

  • Thiago

    Mto bom esse artigo Augusto, eu mesmo ja estava procurando por algum tempo uma ferramenta de ajudasse em profiling

  • João Paulo Sabino

    Ótimo Artigo,
    tb tenho uma dúvida sobre algo que permeia em APM.
    Estou trabalhando num projeto que utiliza aspectos para monitorar o uso de uma aplicação. Como é monitoramento do uso e não em partes da infra-estrutura do sistema, não sei se este tema se encaixaria em APM. Vi algumas referencias que dizem a o monitoramento do uso faz parte da APM, mas não eh mto bem explicado…. gostaria tb de encontrar referencias sobre modos de desenvolvimento de aplicacoes de APM… se alguem puder ajudar agradeço

    jp

  • http://www.ricardomartins.info/blog/2009/08/profiler-no-php-com-cachegrind/ Profiler no PHP com Cachegrind | vIDA e tECNOLOGIA
  • http://bsrsoft.com.br/portal/programacao/bsrsoft-dev-analise-de-performance-em-php/ BSRSoft Dev: Análise de performance em PHP « BSRSoft IDC

    [...] BSRSoft Dev: Análise de performance em PHP Publicado originalmente em 04/05/2009 By Augusto Pascutti Publicado originalmente em:  http://phpsp.org.br/2009/05/04/analise-de-performance/ [...]