2. Quem sou eu
Analista do Serviço Federal de Processamento de
Dados, instrutor e consultor independente.
Evangelista PHP, especialista em arquitetura de
software e contribuidor oficial do projeto Tine 2.0.
5. Viagem Conceitual
Um momento para estabelecer um ponto de
intersecção:
Entre o que você quer e o que você precisa
Entre o que você acredita ser importante e o
que é realmente importante
Entre o que você pretende alcançar e suas
consequências.
7. Por que o Coiote nunca pega o
Papa-Léguas?
Culpa do mau funcionamento dos produtos
ACME?
Culpa dos planos malfeitos do Coiote?
O Papa-Léguas tem poderes sobrenaturais que
o fazem realmente muito, muito rápido?
O Coiote tem muito, muito azar?
16. Ataque Doolitle - 1942
Primeiro ataque aéreo dos Estados
Unidos às ilhas japonesas, 4 meses
após o ataque a Pearl Harbor
17. Mas como?!
Remoção da torre de armas inferior
Remoção do aparelho de rádio
Substituição da mira Norden por uma mira
improvisada, concebida pelo piloto Capitão
Ross C. Greening e chamada de "Mark Twain"
com materiais que custavam 20 centavos.
18. Ataque Doolitle - 1942
Todos os aviões caíram após o ataque.
De 80 tripulantes:
●3 morreram no ataque
●8 foram capturados, sendo que 3 morreram
executados e 1 por doença
●O resto se refugiou na China.
19. O equilíbrio
entre
performance
e segurança
é
fundamental
20. Fatos
PHP raramente é o gargalo.
80-90% do problema está no frontend.
PHP está no backend.
Mas você também pode acelerar os 20-10%.
22. Google, 09/04/2010
"Acelerar websites é importante - não apenas para os
proprietários do site, mas para todos os usuários da
Internet. Sites mais rápido fazem usuários felizes e
nós temos visto em nossos estudos internos que quando
um site responde lentamente, visitantes gastam menos
tempo lá. Mas os sites mais rápidos não apenas
melhoram a experiência do usuário; dados recentes
mostram que a velocidade do site também melhorar
reduz os custos operacionais. Como nós, nossos
usuários dão muito valor à velocidade - é por isso que
nós decidimos levar em conta a velocidade do site em
rankings de pesquisa. Usamos uma variedade de fontes
para determinar a velocidade de um site em relação a
outros sites. "
23. Falando em Google...
Page Speed é um complemento de código
aberto para o Firefox/Firebug. Webmasters e
desenvolvedores da web podem usá-lo para
avaliar o desempenho de suas páginas web e
receber sugestões sobre como melhorá-las.
Está disponível no Google Code:
http://code.google.com/intl/pt-BR/speed/page-speed
27. Regras Yahoo! para Alta Performance
80-90% do tempo gasto na resposta ao usuário
é no download de todos os componentes da
página: imagens, CSS, Javascript, Flash, etc.
Fato: esses componentes são estáticos.
Ao invés de começar com a difícil tarefa de
redesenhar a arquitetura de aplicativos, é
melhor primeiro dispersar seu conteúdo
estático.
A proximidade do usuário com seu servidor tem
impacto no tempo de resposta.
28. Regras Yahoo! para Alta Performance
2ª: Utilize uma rede de entrega de conteúdo
(CDN)
29. Regras Yahoo! para Alta Performance
Como funciona?
A escolha do servidor que irá entregar conteúdo
para um usuário específico normalmente é
baseada em uma medida de proximidade de
rede. Por exemplo, o servidor com o menor
número de pontos de transição de rede ou o
servidor com menor tempo de resposta.
30. Regras Yahoo! para Alta Performance
3ª Use GZip
Desde HTTP/1.1, os clientes Web indicam suporte para
a compressão com o cabeçalho Accept-Encoding na
solicitação HTTP.
AcceptEncoding: gzip, deflate
Se o servidor web vê este cabeçalho na requisição,
pode comprimir a resposta usando um dos métodos
listados pelo cliente. O servidor web notifica o cliente
web sobre isso via cabeçalho Content-Encoding na
resposta.
ContentEncoding: gzip
31. Regras Yahoo! para Alta Performance
4ª Coloque as folhas de estilo no cabeçalho da
página
Porque?
Porque assim a página é renderizada
progressivamente e o usuário não fica vendo uma tela
em branco.
Porque a especificação HTML diz pra fazer assim.
32. Regras Yahoo! para Alta Performance
5ª (Polêmica) Coloque os scripts no final da
página.
Porque?
Scripts bloqueiam downloads paralelos.
A especificação HTTP/1.1 sugere que o browser não
faça download de mais de dois componentes em
paralelo por endereço.
Enquanto um script está sendo descarregado, o
browser não pode iniciar outros downloads, mesmo
que sejam de diferentes endereços.
33. Regras Yahoo! para Alta Performance
6ª Evite expressões CSS. Se não sabe o que é
isso, esqueça, você é feliz.
Era uma vez um navegador chamado Internet Explorer. Em sua
versão 5 seus projetistas inventaram um modo de permitir que
você usasse expressões Javascript em uma propriedade CSS.
Parecia uma ideia fenomenal até que perceberam que as
expressões eram avaliadas não somente quando a página era
carregada, mas quando era redimensionada, rolada e quando o
usuário passava o mouse sobre ela. Um movimento com o
mouse poderia gerar mais de 10 mil avaliações, que consomem
tempo de processamento no frontend.
34. Regras Yahoo! para Alta Performance
6ª Evite expressões CSS.
Ao perceber o efeito Ravena, os
projetistas decidiram tornar essa
característica obsoleta a partir da
versão 8.
35. Regras Yahoo! para Alta Performance
7ª Coloque Javascript e CSS em arquivos
externos
Usar arquivos externos produz páginas mais rápidas porque o
Javascript e CSS são cacheados pelo browser.
Se você usar Javascript e CSS enxertados nos documentos
HTML, eles serão descarregados a cada requisição do
documento HTML.
Bibliotecas Javascript como Dojo Toolkit ajudam a remover o
Javascript remanescente dos documentos HTML.
36. Regras Yahoo! para Alta Performance
8ª Reduza a pesquisa de DNS
O sistema de nomes de domínios mapeia endereços legíveis
para endereços IP. Segundo o Yahoo!, um DNS resolver leva
de 20 a 120ms para pesquisar o IP de um domínio. Enquanto a
pesquisa não for completada, o browser não pode descarregar
mais nada.
Mas se você usar somente um domínio, reduzirá a quantidade
de downloads paralelos que podem ocorrer na página.
A recomendação Yahoo! é não ter mais de quatro domínios em
seu site, para estabelecer o melhor compromisso entre um
número reduzido de pesquisas DNS e uma quantidade
suficiente de downloads paralelos.
37. Regras Yahoo! para Alta Performance
9ª Minifique Javascript e CSS
O tempo de carga de uma página pode ser reduzido se a
quantidade de texto Javascript e CSS que trafegarem pela rede
for reduzida.
Minificar é uma prática que consiste em remover caracteres
que tornam o texto compreensível para um ser humano, mas
que não fazem a menor diferença para o browser. Segundo o
Yahoo!, a minificação pode reduzir em até 21% o conteúdo
original.
Minificar não é comprimir. A minificação pode reduzir ainda
mais a quantidade de dados trafegados.
38. Regras Yahoo! para Alta Performance
10ª Evite usar redirect
Quando se usa redirect, um tempo de espera é introduzido pois
nada pode ser renderizado até que a página solicitada pelo
redirecionamento seja devolvida pelo servidor. Isso pode
implicar em uma tela em branco por tempo suficiente para
desagradar o usuário.
Se você precisa fazer redirecionamento, pode usar recursos do
servidor, como Alias e mod_rewrite, do Apache. Ambos fazem
mapeamento de endereços virtuais para recursos reais.
39. Regras Yahoo! para Alta Performance
11ª Remova scripts duplicados
O número de scripts e o tamanho da equipe de
desenvolvedores pode implicar na existência de scripts
duplicados. Não é algo intencional, mas se depender apenas
do controle humano, pode fatalmente acontecer.
Scripts replicados implicam em requisições replicadas. Ou seja,
uma requisição desnecessária é feita, porque ela já foi atendida
pelo primeiro “clone” do script.
40. Regras Yahoo! para Alta Performance
12ª Avalie se o uso de ETags é necessário
Entity Tags é um mecanismo de validação de cache do HTTP
que cria um código baseado no estado de um conteúdo
(Javascript, CSS, imagem, etc) para saber se o que está no
servidor é diferente do que está no cache.
O problema é que se você usar múltiplos servidores, ETags
pode gerar códigos de verificação diferentes para o mesmo
conteúdo, recuperado a partir de servidores diferentes. Ou
seja, requisições desnecessárias podem ser feitas.
41. Regras Yahoo! para Alta Performance
13ª Otimize as respostas AJAX
AJAX é Asynchronous Javascript and XML e não Instantaneous
Javascript and XML.
Todas as orientações anteriores podem ser aplicadas para
respostas AJAX.
42. Regras Yahoo! para Alta Performance
15ª Use GET para requisições AJAX
O Yahoo! descobriu que o método POST do objeto
XMLHttpRequest é implementado nos browsers como um
processo em duas etapas. Primeiro ele envia o cabeçalho,
depois os dados.
Se você não precisar mandar mais de 2K de dados, pode usar
GET, que usa apenas um pacote TCP para ser enviado (exceto
se houver muitos cookies).
43. Regras Yahoo! para Alta Performance
16 ª e 17ª Componentes Précarregados e Pós
carregados
Precarregar componentes significa aproveitar o momento em
que o browser está desocupado para requisitar componentes
que serão necessários no futuro.
Poscarregar componentes significa verificar o que não é
imediatamente necessário na página e deixar por último. Por
exemplo, imagens e scripts de drag and drop.
44. Regras Yahoo! para Alta Performance
18 ª Reduza o número de elementos DOM
Uma árvore DOM complexa significa mais bytes para serem
carregados pelo browser.
Corte o que não é necessário.
A homepage do Yahoo!, para uma referência, tem menos de
700 elementos.
O número de elementos DOM pode ser obtido com o seguinte
Javascript:
document.getElementsByTagName('*').length
45. Regras Yahoo! para Alta Performance
19 ª Divida os componentes entre domínios
Para maximizar a quantidade de downloads paralelos, você
pode ter mais de um domínio. Mas não esqueça da regra nº8.
46. Regras Yahoo! para Alta Performance
20 ª Minimize (ou remova) os iframes
Contras do iframe
O documento a ser inserido no atual é procurado e mesmo
que esteja em branco, desperdiçará uma requisição e uma
resposta.
A montagem do iframe bloqueia o carregamento da página.
47. Regras Yahoo! para Alta Performance
21 ª Acabe com os erros 404 do HTTP
Erro 404 é “página não encontrada”
Não parece um problema de performance? Pois o usuário irá
lhe dizer quanto tempo ele perdeu até saber o que fazer após
levar um “Page Not Found” na cara.
48. Regras Yahoo! para Alta Performance
22 ª Reduza o tamanho dos cookies
Elimine cookies desnecessários.
Reduza o tamanho dos cookies.
Configure uma data de expiração apropriada.
49. Regras Yahoo! para Alta Performance
23ª Use domínios sem cookie para componentes
Quando o browser requisita uma imagem e ela envia cookies
junto, o servidor não os usa pra nada. Assim eles só criam
tráfego de rede.
Crie um subdomínio livre de cookies, e hospede todos os
componentes estáticos lá.
50. Regras Yahoo! para Alta Performance
24ª Reduza o acesso à arvore DOM
Uma interface com o usuário rica oferece uma ao usuário uma
experiência agradável, mas se você exagerar no dinamismo,
vai introduzir lentidão ao acessar a árvore DOM muitas vezes.
Verifique também os métodos de pesquisa dos nós, para
utilizar as alternativas que tenham o melhor desempenho.
Bibliotecas Javascript oferecem APIs que tem desempenho
superior aos recursos equivalentes no Javascript padrão.
51. Regras Yahoo! para Alta Performance
25ª Desenvolva manipuladores de evento
inteligentes
Javascript suporta a propagação de eventos. Isso significa que
um se um evento ocorrer para um elemento que não tem
manipulador de eventos, será tratado pelo manipulador de
eventos do nó pai.
Dessa forma, se existirem eventos que serão disparados
independente do elemento, você pode associar o evento
apenas ao nó pai. Por exemplo, uma determinada função é
executada para qualquer botão dentro de uma divisão de
página. Associe o evento à divisão e não a cada botão.
52. Regras Yahoo! para Alta Performance
26ª Escolha <link> em vez de @import
Segundo o Yahoo!, no IE, o @import tem o mesmo efeito de
colocar <link> no final da página.
27ª Evite o Filtro AlphaImageLoader
Segundo o Yahoo!, esse filtro, disponível apenas nas versões
do IE < 7, bloqueia a renderização da página e trava o browser
enquanto a imagem está sendo descarregada.
53. Regras Yahoo! para Alta Performance
28ª Otimize as imagens
29ª Otimize a forma como o CSS dispõe as
imagens
30ª Não use imagens maiores do que você
precisa
Se você vai mostrar uma imagem com um tamanho de
100X100px, não precisa pegar uma imagem de 500X500px e
redimensionar. Use uma imagem com o tamanho que você irá
utilizar.
54. Regras Yahoo! para Alta Performance
31ª Faça o favicon.ico ficar bem pequeno
Este é o ícone que aparece na barra de endereços do
navegador. Você precisa dele porque se o browser procurá-lo e
não achar, irá receber um erro HTTP 404.
32ª Mantenha os componentes abaixo de 25K
Esta é uma restrição do Iphone.
33ª Empacote os componentes em um
documento multi-partes.
Isso permite que vários arquivos sejam recuperados com uma
única requisição HTTP.
55. Regras Yahoo! para Alta Performance
34ª Evite tags <img> com atributo src vazio
O browser tenta fazer uma requisição do mesmo jeito.
Será que
esse frontend
não termina
nunca?
57. os
em
lL
ue
an
M
By
2 ideias são especificamente sobre performance
58. PHP não é uma linguagem
compilada (MITO)
“PHP não é uma linguagem interpretada desde o PHP 4, que foi
lançado no ano de 2000.
Quando um script PHP é executado pela primeira vez, o código-
fonte PHP é compilado pelo motor Zend em representações
binárias chamadas opcodes. Estes opcodes são armazenados na
área de memória compartilhada do servidor. Em seguida, são
executados.”
ML
Então, PHP é uma linguagem compilada como Java, C # e outras.
Caso contrário, seria bastante lento.
59.
60. E ainda tem mais!
Você pode usar ofuscadores para gravar opcodes
compilados em arquivos e distribuir a aplicação
sem o código-fonte.
61. E ainda mais rápido!
Você pode compilar o PHP
gerando código nativo da
máquina onde será executado.
Roadsend PHP (GPL)
PHC PHP Open Source compiler
HipHop for PHP (PHP/Zend)
62. PHP não é bom para web sites ou aplicações
escaláveis de alto desempenho
“...desempenho e escalabilidade não são uma
questão de linguagem, mas sim uma questão de
arquitetura de aplicação”.
“A maioria das aplicações Web não fazem uso
intensivo da CPU. Por exemplo, uma das
atividades que as aplicações Web gastam a
maior parte do tempo é o acesso a bancos de
dados”.
ML
63. Arquitetura
PHP é como tijolinhos da LEGO.
Tijolinhos da LEGO permitem que você construa
qualquer coisa.
64. Arquitetura
Mas PHP não é um brinquedo.
Nós o usamos para construir “prédios” de verdade.
68. Como frear o PHP?
Carregue arquivos sem precisar
Não use cache
Consulte o banco sem necessidade
Não otimize o banco de dados
Não faça processamento paralelo
69. Carregamento de Arquivos
Otimize o carregamento de arquivos.
Só carregue quando precisar. Seja brasileiro e
deixe tudo para a última hora.
Estabeleça ou adote convenções para acelerar
a busca pelos arquivos.
70. Consulta ao banco sem
necessidade
Se existe informação frequentemente
pesquisada no banco de dados que não muda,
verifique se ela não pode ficar em outro lugar:
Arquivos de metadados.
Camada de modelo da aplicação.
Frameworks ajudam nisso.
72. Cache
É mais rápido pegar o que está por perto.
Sugestão: Memcached
Escalável: fácil adicionar máquinas e instâncias
RAM é muito mais rápido que I/O em disco
Alivia a carga do banco de dados
Muito flexível: pode armazenar qualquer dado, desde
que não ultrapasse 1 MB
Biblioteca client disponível em PHP
Open Source
73. Processamento Paralelo
Sugestão: Gearman
Framework genérico para distribuir jobs a serem
executados por uma ou mais máquinas
Permite uma aplicação executar tarefas em
paralelo, com balanceamento da carga de
processos, e até invocar códigos escritos em outras
linguagens.
O nome é um anagrama para "Manager"
Criado pela Danga Interactive.
Open Source, rápido, escalável, tolerante a falhas,
síncrono ou assíncrono.
75. Você utiliza metodologias ágeis para
desenvolver?
Uma das orientações de um processo de
desenvolvimento ágil e ter entregas curtas. Você
não espera até o sistema inteiro estar pronto para
entregá-lo (e se frustrar com as negativas do
cliente).
Isso é bom porque além de verificar
constantemente os requisitos, também mostra
para o cliente que o trabalho está sendo
realizado, e em que estágio se encontra.
76. Mas o que isso tem a ver com desempenho?
Você quer que o usuário fique frustrado e furioso
na expectativa de que a página em branco seja
substituída por alguma informação, ou quer
deixá-lo mais tranquilo, mostrando que a página
será montada?
77. Olha a Regra Yahoo para Alta
Performance que ficou faltando!
14ª Libere o buffer no início
Quando você requisita uma página, pode levar de 200 a 500ms
para o backend montá-la e enviá-la.
PHP tem a função flush() que permite que você envie
parcialmente uma resposta HTML para o browser.
Assim, o servidor pode ir enviando a página conforme ela vai
sendo montada.