Como melhoro o desempenho do aplicativo ASP.NET MVC?

Respostas:

311

Uma lista compilada de possíveis fontes de melhoria está abaixo:

Geral

  • Utilize um criador de perfil para descobrir vazamentos de memória e problemas de desempenho em seu aplicativo. pessoalmente, sugiro dotTrace
  • Execute seu site no modo Release, não no modo Debug, quando estiver em produção e também durante a criação de perfil de desempenho. O modo de lançamento é muito mais rápido. O modo de depuração pode ocultar problemas de desempenho em seu próprio código.

Armazenamento em cache

  • Use CompiledQuery.Compile() recursivamente evitando a recompilação de suas expressões de consulta
  • Armazenar em cache conteúdo não propenso a alterações usando OutputCacheAttribute para salvar execuções desnecessárias e de ação
  • Use cookies para informações não confidenciais acessadas com frequência
  • Utilize ETags e expiração - escreva seus ActionResultmétodos personalizados , se necessário
  • Considere usar o RouteNamepara organizar suas rotas e, em seguida, use-o para gerar seus links e tente não usar o método ActionLink baseado em árvore de expressão.
  • Considere implementar uma estratégia de cache de resolução de rota
  • Coloque o código repetitivo dentro do seu PartialViews, evite renderizá-lo xxxx vezes: se você acabar chamando as mesmas parciais 300 vezes na mesma exibição, provavelmente há algo errado com isso. Explicação e Benchmarks

Encaminhamento

Segurança

  • Use autenticação de formulários, mantenha seus dados confidenciais acessados ​​com frequência no tíquete de autenticação

DAL

Balanceamento de carga

  • Utilize proxies reversos para distribuir a carga do cliente em toda a instância do aplicativo. (Estouro de pilha usa HAProxy ( MSDN ).

  • Use Controladores assíncronos para implementar ações que dependem do processamento de recursos externos.

Lado do cliente

  • Otimize seu lado do cliente, use uma ferramenta como o YSlow para obter sugestões para melhorar o desempenho
  • Use o AJAX para atualizar os componentes da sua interface do usuário, evite uma atualização de página inteira quando possível.
  • Considere implementar uma arquitetura pub-sub -cometa- para entrega de conteúdo contra recarga com base em tempos limite.
  • Mova a lógica de geração de gráficos e gráficos para o lado do cliente, se possível. A geração de gráficos é uma atividade cara. Adiar para o lado do cliente o servidor de uma carga desnecessária e permitir que você trabalhe com gráficos localmente sem fazer uma nova solicitação (por exemplo, gráficos flexíveis , jqbargraph , MoreJqueryCharts ).
  • Use CDNs para scripts e conteúdo de mídia para melhorar o carregamento no lado do cliente (por exemplo, Google CDN )
  • Minify - Compile - seu JavaScript para melhorar o tamanho do seu script
  • Mantenha o tamanho do cookie pequeno, pois os cookies são enviados ao servidor em todas as solicitações.
  • Considere usar DNS e pré-busca de link, quando possível.

Configuração global

  • Se você usa o Razor, adicione o código a seguir no seu global.asax.cs, por padrão, o Asp.Net MVC é renderizado com um mecanismo aspx e um mecanismo razor. Isso usa apenas o RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Adicione gzip (compactação HTTP) e cache estático (imagens, css, ...) no seu web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Remover módulos HTTP não utilizados
  • Libere seu HTML assim que ele for gerado (em seu web.config) e desative o viewstate se você não estiver usando <pages buffer="true" enableViewState="false">
SDReyes
fonte
6
espere, você quer dizer que eu perco o desempenho quando, por exemplo, tenho uma exibição que exibe um conjunto de resultados irritante através de um IList e chamo Render.PartialView ("Row", item) para cada item da lista? quanto eu perco? ou como eu poderia medir o ganho de desempenho?
marc.d
@SDReyes - qual é o significado da arquitetura pub-sub ?
Mohammed Zameer
1
Isso é legal. O link do Uber Profiler está morto. Em vez disso, isso deve ser vinculado a um dos criadores de perfil específicos do ORM?
Shanabus
12

A sugestão básica é seguir os princípios REST e os seguintes pontos vinculam alguns desses princípios à estrutura do ASP.NET MVC:

  1. Torne seus controladores sem estado - esta é mais uma sugestão de 'desempenho / escalabilidade da Web ' (em oposição ao desempenho no nível de micro / máquina) e uma decisão importante de design que afetaria o futuro de seus aplicativos - especialmente no caso de se tornar popular ou se você precisar de algum tolerância a falhas, por exemplo.
    • Não use sessões
    • Não use tempdata - que usa sessões
    • Não tente 'armazenar em cache' tudo 'prematuramente'.
  2. Usar autenticação de formulários
    • Mantenha seus dados confidenciais acessados ​​com frequência no tíquete de autenticação
  3. Use cookies para informações não confidenciais acessadas com frequência
  4. Torne seus recursos acessíveis na Web
  5. Compile seu JavaScript. Também existe a biblioteca do compilador Closure (com certeza há outras, basta procurar por 'compilador JavaScript' também)
  6. Use CDNs (rede de entrega de conteúdo) - especialmente para seus arquivos de mídia grandes e assim por diante.
  7. Considere diferentes tipos de armazenamento para seus dados, por exemplo, arquivos, armazenamento de chave / valor etc. - não apenas o SQL Server
  8. Por último, mas não menos importante, teste o desempenho do seu site
ziya
fonte
10

O Code Climber e esta entrada de blog fornecem maneiras detalhadas de aumentar o desempenho do aplicativo.

A consulta compilada aumentará o desempenho do seu aplicativo, mas não tem nada em comum com o ASP.NET MVC. Ele irá acelerar todos os aplicativos de banco de dados, por isso não se trata realmente de MVC.

LukLed
fonte
7

Isso pode parecer óbvio, mas execute o site no modo Release, não no modo Debug, quando estiver em produção e também durante a criação de perfil de desempenho. O modo de lançamento é muito mais rápido. O modo de depuração pode ocultar problemas de desempenho em seu próprio código.

Craig Stuntz
fonte
6

Não é uma otimização de abalar a terra, mas eu pensei que eu ia jogar isso lá fora - Use CDN para jQuery, etc .

Citação do próprio ScottGu: O CDN do Microsoft Ajax permite melhorar significativamente o desempenho dos aplicativos ASP.NET Web Forms e ASP.NET MVC que usam ASP.NET AJAX ou jQuery. O serviço está disponível gratuitamente, não requer nenhum registro e pode ser usado para fins comerciais e não comerciais.

Até usamos o CDN para nossas peças da Web no Moss que usam jQuery.

Ta01
fonte
5

Vou acrescentar também:

  1. Usar Sprites : Sprites são ótimos para reduzir uma solicitação. Você mescla todas as suas imagens em uma única e usa CSS para obter boa parte do sprite. A Microsoft fornece uma boa biblioteca para isso: Sprite e Image Optimization Preview 4 .

  2. Armazenar em cache o objeto do servidor : se você tiver algumas listas de referências ou dados que serão alterados raramente, poderá armazená-los na memória em vez de consultar o banco de dados todas as vezes.

  3. Use o ADO.NET em vez do Entity Framework : EF4 or EF5são ótimos para reduzir o tempo de desenvolvimento, mas será difícil otimizar. É mais simples otimizar um procedimento armazenado do que o Entity Framework. Portanto, você deve usar os procedimentos de armazenamento o máximo possível. O Dapper fornece uma maneira simples de consultar e mapear SQL com desempenho muito bom.

  4. Página de cache ou página parcial : o MVC fornece um filtro fácil para armazenar em cache a página de acordo com alguns parâmetros, portanto, use-o.

  5. Reduzir chamadas de banco de dados : você pode criar uma solicitação de banco de dados exclusiva que retorne vários objetos. Verifique no site Dapper.

  6. Sempre tenha uma arquitetura limpa : tenha uma arquitetura limpa de n camadas, mesmo em um projeto pequeno. Isso ajudará você a manter seu código limpo e será mais fácil otimizá-lo, se necessário.

  7. Você pode dar uma olhada neste modelo "Modelo Neos-SDI MVC ", que criará uma arquitetura limpa para você com muitas melhorias de desempenho por padrão (consulte o site do MvcTemplate ).

Jeff Lequeux
fonte
Você acha que é melhor executar um procedimento armazenado que retorne mais conjuntos de resultados e execute mais procedimentos armazenados no modo assíncrono?
Muflix 9/08/16
4

Além de todas as ótimas informações sobre como otimizar seu aplicativo no lado do servidor, eu diria que você deve dar uma olhada no YSlow . É um excelente recurso para melhorar o desempenho do site no lado do cliente.

Isso se aplica a todos os sites, não apenas ao ASP.NET MVC.

Steve Haigh
fonte
3

Uma coisa super fácil de fazer é pensar de forma assíncrona ao acessar os dados que você deseja para a página. Quer esteja lendo um serviço da Web, arquivo, banco de dados ou outra coisa, use o modelo assíncrono o máximo possível. Embora não necessariamente ajude qualquer página a ser mais rápida, ajudará seu servidor a ter um desempenho melhor no geral.

Sem Reembolsos Sem Devoluções
fonte
2

1: Obter horários. Até você saber onde está a desaceleração, a pergunta é ampla demais para responder. Um projeto no qual estou trabalhando tem esse problema preciso; Não há registro para saber quanto tempo certas coisas levam; só podemos adivinhar as partes lentas do aplicativo até adicionar horários ao projeto.

2: Se você tiver operações seqüenciais, não tenha medo de multithread levemente. ESPECIALMENTE se houver operações de bloqueio. PLINQ é seu amigo aqui.

3: Pregere suas exibições do MVC ao publicar ... Isso ajudará em alguns dos 'hits da primeira página'

4: Alguns defendem as vantagens da velocidade do procedimento armazenado / ADO. Outros defendem a velocidade de desenvolvimento da EF e uma separação mais clara dos níveis e seus objetivos. Vi projetos muito lentos quando o SQL e as soluções alternativas para usar Sprocs / Views para recuperação e armazenamento de dados. Além disso, sua dificuldade para testar aumenta. Nossa base de código atual que estamos convertendo de ADO para EF não está apresentando desempenho pior (e em alguns casos melhor) que o antigo modelo Hand-Rolled.

5: Dito isto, pense no aplicativo Warmup. Parte do que fazemos para ajudar a eliminar a maioria dos problemas de desempenho da EF foi adicionar um método especial de aquecimento. Ele não pré-compila nenhuma consulta ou qualquer coisa, mas ajuda com grande parte do carregamento / geração de metadados. Isso pode ser ainda mais importante ao lidar com os modelos Code First.

6: Como já foi dito, não use o estado da sessão ou o ViewState, se possível. Elas não são necessariamente otimizações de desempenho nas quais os desenvolvedores pensam, mas quando você começa a escrever aplicativos da Web mais complexos, deseja capacidade de resposta. O estado da sessão impede isso. Imagine uma consulta de longa duração. Você decide abrir uma nova janela e tentar uma menos complexa. Bem, você também pode ter esperado com o estado da sessão ativado, porque o servidor aguardará até que a primeira solicitação seja concluída antes de passar para a próxima para essa sessão.

7: Minimize as viagens de ida e volta ao banco de dados. Salve as coisas que você usa com freqüência, mas não muda de maneira realista para o seu cache .Net. Tente agrupar suas inserções / atualizações sempre que possível.

7.1: Evite o código de acesso a dados em suas visualizações do Razor sem uma boa razão. Eu não diria isso se não tivesse visto. Eles já estavam acessando seus dados ao montar o modelo, por que diabos eles não estavam incluídos no modelo?

to11mtm
fonte
2
  1. Implemente o Gzip.
  2. Use a renderização assíncrona para visualizações parciais.
  3. Minimize as ocorrências no banco de dados.
  4. Use uma consulta compilada.
  5. Execute um criador de perfil e descubra hits desnecessários. Otimize todos os procedimentos armazenados que estão demorando mais de 1 segundo para retornar uma resposta.
  6. Use cache.
  7. Use otimização de minificação de pacote configurável .
  8. Use utilitários HTML 5 como cache de sessão e armazenamento local para conteúdo somente leitura.
Vinayak
fonte
2

Só queria adicionar meus 2 centavos. A maneira MAIS eficaz de otimizar a geração de rotas de URL em um aplicativo MVC é ... não gerá-las.

A maioria de nós, mais ou menos, sabe como os URLs são gerados em nossos aplicativos de qualquer maneira; portanto, simplesmente usando estática em Url.Content("~/Blahblah")vez de Url.Action()ou sempre Url.RouteUrl()que possível, supera todos os outros métodos quase 20 vezes e até mais.

PS. Fiz uma referência de algumas milhares de iterações e publiquei resultados no meu blog, se estiver interessado.

Alex
fonte
1

Em seu clamor para otimizar o lado do cliente, não se esqueça da camada do banco de dados. Tivemos um aplicativo que passou de 5 segundos para carregar até 50 segundos durante a noite.

Na inspeção, fizemos várias alterações no esquema. Depois que atualizamos as estatísticas, de repente ela se tornou tão responsiva quanto antes.

Robbie Dee
fonte
0

A seguir estão as coisas a fazer

  1. Cache do modo Kernel
  2. Modo Pipeline
  3. Remova os módulos não utilizados
  4. runAllManagedModulesForAllRequests
  5. Não escreva em wwwroot
  6. Remover mecanismos e idioma de exibição não utilizados
Zahid Mustafa
fonte
0

O uso de Empacotamento e Minificação também ajuda a melhorar o desempenho. Basicamente, reduz o tempo de carregamento da página.

Neelima
fonte
0

Se você estiver executando o aplicativo ASP.NET MVC no Microsoft Azure (IaaS ou PaaS), faça o seguinte pelo menos antes da primeira implantação.

  • Analise o seu código com o analisador de código estático em busca de qualquer tipo de dívida, duplicação, complexidade e segurança.
  • Sempre habilite o Application Insight e monitore o desempenho, navegadores e análises com frequência para encontrar os problemas em tempo real no aplicativo.
  • Implemente o Cache Redis do Azure para alterar dados estáticos e com menos frequência, como imagens, ativos, layouts comuns etc.
  • Confie sempre nas ferramentas do APM (Application Performance Management) fornecidas pelo Azure.
  • Consulte o mapa do aplicativo com frequência para investigar o desempenho da comunicação entre partes internas do aplicativo.
  • Monitore o desempenho do banco de dados / VM também.
  • Use o Balanceador de carga (escala horizontal) se necessário e dentro do orçamento.
  • Se seu aplicativo tiver o público-alvo em todo o mundo, use o Azure Trafic Manager para manipular automaticamente a solicitação recebida e desviá-la para a instância de aplicativo mais disponível.
  • Tente automatizar o monitoramento de desempenho escrevendo os alertas com base no baixo desempenho.
Tahir Alvi
fonte
0

Use a versão mais recente da Task Parallel Library (TPL) , de acordo com a versão .Net. Tem que escolher os módulos corretos do TPL para diferentes fins.

agileDev
fonte
0

Eu fiz todas as respostas acima e simplesmente não resolveu o meu problema.

Por fim, resolvi meu problema de carregamento lento do site com a configuração PrecompileBeforePublish no perfil de publicação como true . Se você deseja usar o msbuild, pode usar este argumento:

 /p:PrecompileBeforePublish=true

Isso realmente ajuda muito. Agora meu MVC ASP.NET carrega 10 vezes mais rápido.

Amir Pourmand امیر پورمند
fonte