Como melhorar a performance de websites.net Os segredos dos sites de alto desempenho Alfredo Lotar Novatec
Novatec Editora Ltda. [2013]. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Capa: Carolina Kuwabata Revisão gramatical: Cristiane Bernardi Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-381-9 Histórico de impressões: Outubro/2013 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 São Paulo, SP Brasil Tel.: +55 11 2959-6529 Fax: +55 11 2950-8869 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec MP20130920
Sumário Prefácio...15 Capítulo 1 Introdução...16 1.1 Minimize as idas e vindas de solicitações e respostas pela rede... 17 1.2 Reduza a quantidade de informações enviadas pela rede... 17 1.3 Armazene em cache os recursos compartilhados... 18 1.4 Evite trabalho desnecessário... 18 1.5 Evite múltiplos processos e/ou servidores... 18 1.6 Diminua o tempo de bloqueio de uma operação... 19 1.7 Minimize o tamanho das páginas... 19 1.7.1 Comentários... 21 1.8 Tabelas... 21 1.9 Reduza o número de elementos DOM...22 1.10 Defina o conjunto de caracteres...22 1.11 Cuidado com mecanismos de busca...23 1.12 DNS...23 1.13 Ícone...24 1.14 JavaScript...25 1.14.1 Limite o número de arquivos.js...26 1.14.2 Carregue arquivos.js sem bloquear a página...27 1.14.3 Elimine conteúdo desnecessário de arquivos.js...27 1.14.4 Evite document.write()...30 1.14.5 Carregue alguns arquivos.js de forma assíncrona...30 1.14.6 CDN... 31 1.15 Folhas de estilo CSS...32 1.15.1 Reduza o tamanho dos arquivos.css...32 1.15.2 Múltiplos arquivos.css...33 1.15.3 Evite bloquear o carregamento da página...33 1.15.4 Otimize a ordem de execução dos arquivos.css e.js...34
8 Como melhorar a performance de websites.net 1.16 Imagens...37 1.16.1 Novo formato de arquivos...38 1.16.2 Como carregar imagens, fotos e figuras...38 1.16.3 Cache de imagens...40 1.16.4 Cache... 41 1.16.5 Image sprites...42 1.16.6 CDN...44 1.17 Download...44 Capítulo 2 Páginas e controles do ASP.NET...45 2.1 AutoEventWireup sempre false...45 2.2 Use Server.Transfer...46 2.3 Bundling e minificação...47 2.3.1 Criando bundles personalizados...48 2.3.2 Desabilitando a minificação em bundles...50 2.3.3 Definindo bundles com CDN...50 2.3.4 Usando bundles... 51 2.4 Server controls...55 2.4.1 View State...56 2.4.2 Não use o controle Label...58 2.4.3 Use server controls somente quando apropriado...58 2.4.4 Evite controles embutidos...60 2.4.5 Data binding... 61 2.4.6 Desative o tema nos controles...63 2.4.7 Evite os controles de validação...63 2.5 Estado do aplicativo...64 2.5.1 Armazene o estado do aplicativo no cliente...64 2.5.2 Não use o objeto Application...64 2.6 Estado de sessão... 66 2.6.1 Diminua o tempo da sessão...67 2.6.2 Formas de armazenamento... 68 2.7 Diminua os acessos ao servidor de banco de dados...70 2.7.1 IsPostBack...70 2.7.2 Validação do lado do cliente e do servidor... 71 2.7.3 Ajax...75 2.7.4 Cache...97 Capítulo 3 ASP.NET MVC... 106 3.1 Cache do ASP.NET MVC...106 3.2 Estado de sessão... 107
Sumário 9 3.3 Ative a validação no cliente... 108 3.4 Desative os mecanismos de exibição... 109 3.5 Desative o Debug...110 3.6 Defina explicitamente o nome do view...110 3.7 Evite passar um model como null...110 3.8 Como carregar user controls partial views... 111 3.9 Desinstale o URL Rewrite... 111 3.10 Use elementos HTML...112 Capítulo 4 Código gerenciado... 113 4.1 Value Types...113 4.2 Reference Types...113 4.2.1 Tipo Object...114 4.3 Boxing e Unboxing...114 4.4 Conversões...116 4.5 Desenvolvimento de classes...118 4.5.1 Classes seladas...118 4.5.2 Use sobrecarga de métodos...119 4.5.3 Finalize e Dispose... 122 4.6 Use a instrução for... 124 4.6.1 Testes de comparação... 124 4.6.2 Execute o código diretamente dentro do loop... 126 4.6.3 Crie uma instância de classe fora do loop... 127 4.7 for ou foreach... 129 4.8 Parallel.For...131 4.9 Parallel.ForEach... 134 4.10 Parallel.For ou Parallel.ForEach... 135 4.11 Manipulando exceções... 135 4.11.1 Instrução throw... 136 4.11.2 Use a instrução finally para liberar recursos... 139 4.11.3 Evite manipular exceções genéricas... 139 4.11.4 Monitore as exceções do aplicativo... 140 4.12 Array... 140 4.12.1 Array de array... 142 4.12.2 Extraindo informações de um array... 142 4.12.3 Testes de comparação... 143 4.13 Coleções... 148 4.13.1 Determine o tipo de dados correto... 148 4.13.2 Escolha o tipo correto de coleção... 149 4.13.3 Defina o número de itens da coleção... 152
10 Como melhorar a performance de websites.net 4.13.4 Obtendo o conteúdo de uma coleção... 152 4.13.5 Testes de performance... 154 Capítulo 5 ADO.NET... 158 5.1 Use o provedor de dados correto... 158 5.2 Use autenticação Windows... 159 5.3 Abrir e fechar conexões... 159 5.4 Pool de conexões... 162 5.4.1 Monitorando o pool de conexões... 163 5.5 Limite a quantidade de informações recuperadas... 164 5.6 Paginação... 164 5.7 Múltiplas instruções SQL...168 5.8 Método ExecuteNonQuery... 169 5.9 Método ExecuteScalar... 170 5.10 Use o método GetOrdinal com DataReaders... 170 5.11 Enumeração CommandBehavior.SequentialAccess... 173 5.12 Stored procedures... 173 5.12.1 Parâmetros de saída... 177 5.13 Usando o método Prepare... 178 5.14 DataSet... 179 5.14.1 DataSet tipados... 180 5.14.2 Testes de comparação... 182 5.15 Transações... 183 5.15.1 Transações SQL... 183 5.15.2 Transações ADO.NET... 184 5.15.3 MSDTC... 185 5.15.4 Defina o nível de isolamento apropriado... 186 5.15.5 Propriedade Enlist igual a false... 187 5.16 Use um objeto IEnumerable ou List<T>em vez de DataSet... 187 5.16.1 Testes de comparação... 194 5.17 Microsoft Data Access Application Block... 196 5.18 Camada de dados personalizada... 198 5.19 Testes de comparação...202 Capítulo 6 ADO.NET Entity Framework... 205 6.1 Crie arquivos.edmx pequenos...205 6.2 Recupere entidades com o método AsNoTracking...206 6.3 AutoDetectChangesEnabled igual false...208 6.4 Recupere somente as informações necessárias...209
Sumário 11 6.5 Filtre as informações corretamente... 210 6.5.1 Filtre antes de usar o método ToList... 211 6.6 Carregue informações de forma eficiente... 213 6.6.1 Cuidado com o método Include... 213 6.7 Paginação... 216 6.8 IEnumerable<T> versus IQueryable<T>...217 6.9 Pré-compilação de consultas LINQ...219 6.10 Geração de views...221 6.10.1 Como pré-gerar um view...221 6.11 Economize recursos ao atualizar ou excluir informações...228 6.12 Paralelismo...230 6.13 Teste de comparação...230 6.13.1 Testando o desempenho com o método AsParallel... 234 6.13.2 Repositório genérico...236 Capítulo 7 SQL Server... 240 7.1 Tabelas...241 7.1.1 Tipos de dados... 242 7.1.2 Desnormalização... 243 7.2 Índices...246 7.2.1 Benefícios de um índice...246 7.2.2 Tipos de índices... 247 7.2.3 Considerações importantes sobre índices... 249 7.2.4 Quando não usar índices... 252 7.3 Consultas... 252 7.3.1 Recupere somente as linhas e colunas necessárias... 252 7.3.2 Declare os objetos do banco de dados com nome completo... 252 7.3.3 Cláusula WHERE... 253 7.3.4 Minimize o uso de cursores...256 7.3.5 Evite a conversão... 257 7.3.6 Use UNION ALL em vez de UNION... 257 7.3.7 Use stored procedures ou consultas com parâmetros... 257 Capítulo 8.NET Framework Performance... 262 8.1 Manipulando string...262 8.1.1 Comparações...262 8.1.2 Concatenação de strings...263 8.1.3 Format ou ToString... 267 8.1.4 IsNullOrEmpty ou IsNullOrWhiteSpace...270 8.2 Expressões regulares... 271
12 Como melhorar a performance de websites.net 8.3 Leitura de arquivos...272 8.3.1 Testes de comparação... 275 8.4 Gravação de arquivos... 278 8.4.1 Testes de comparação...280 8.5 Documentos XML...280 8.5.1 Use XmlReader... 281 8.5.2 Pule partes de um documento XML...282 8.5.3 Validando um documento XML...282 8.5.4 Criando documentos XML...284 8.5.5 Use XPathDocument para processar consultas XPath...285 8.5.6 Não use o operador //...285 8.5.7 Compile expressões frequentemente usadas...285 8.5.8 Cache de folhas de estilo XSLT...286 8.6 Obtendo a data e a hora...287 Capítulo 9 Considerações sobre implantação... 289 9.1 Limite o número de assemblies...289 9.2 Configure o aplicativo corretamente...290 9.2.1 Debug...290 9.2.2 Desative módulos não usados...290 9.2.3 Configure a diretiva @ Page corretamente...293 9.2.4 Desative a autenticação...295 9.3 Compactando as solicitações de um website...295 9.3.1 Compactando arquivos.js e.css...298 9.4 Pré-compilação...302 9.5 Atualize o website corretamente...304 9.6 Use SSL...305 9.7 Native Image Generator (Ngen.exe)...305 Apêndice A Ferramentas úteis... 307 A.1 Monitore as solicitações HTTP...307 A.1.1 Como instalar o Firebug...307 A.2 Softwares de análise de páginas...310 A.3 Monitorando o tempo de resposta... 311 A.4 Computador usado nos testes...312 A.5 Ferramentas de monitoramento...312 A.5.1 Monitor de desempenho...313 A.5.2 Visual Studio Profiler...313 A.5.3 CLR Profiler...317 A.6 Contadores de desempenho...318
Sumário 13 Apêndice B CheckList... 322 Checklist: Introdução... 322 Checklist: Páginas e controles do ASP.NET... 323 Checklist: ASP.NET MVC... 324 Checklist: Código gerenciado... 324 Checklist: ADO.NET... 325 Checklist: ADO.NET Entity Framework... 326 Checklist: SQL Server... 326 Checklist:.NET Framework Performance... 327 Checklist: Considerações sobre implantação... 328