Come posso migliorare le prestazioni dell'applicazione ASP.NET MVC?


Risposte:


311

Di seguito è riportato un elenco compilato di possibili fonti di miglioramento:

Generale

  • Utilizza un profiler per scoprire perdite di memoria e problemi di prestazioni nella tua applicazione. personalmente suggerisco dotTrace
  • Esegui il tuo sito in modalità Rilascio, non in modalità Debug, durante la produzione e anche durante la profilazione delle prestazioni. La modalità di rilascio è molto più veloce. La modalità debug può nascondere problemi di prestazioni nel tuo codice.

caching

  • Utilizzare CompiledQuery.Compile() ricorsivamente evitando la ricompilazione delle espressioni di query
  • Memorizza nella cache il contenuto non soggetto a modifiche utilizzando OutputCacheAttribute per salvare esecuzioni inutili e di azioni
  • Utilizzare i cookie per informazioni non sensibili a cui si accede frequentemente
  • Utilizza ETag e scadenza - ActionResultSe necessario, scrivi i tuoi metodi personalizzati
  • Prendi in considerazione l'idea RouteNamedi organizzare i percorsi, quindi di utilizzarli per generare i tuoi collegamenti e prova a non utilizzare il metodo ActionLink basato sull'albero delle espressioni.
  • Prendi in considerazione l'implementazione di una strategia di memorizzazione nella cache della risoluzione del percorso
  • Inserisci il codice ripetitivo nel tuo PartialViews, evita di renderlo xxxx volte: se finisci per chiamare lo stesso parziale 300 volte nella stessa vista, probabilmente c'è qualcosa che non va. Spiegazione e benchmark

Routing

Sicurezza

  • Usa autenticazione moduli, conserva i dati sensibili a cui accedi frequentemente nel ticket di autenticazione

DAL

Bilancio del carico

  • Utilizza i proxy inversi per distribuire il carico del client sull'istanza dell'app. (Stack Overflow utilizza HAProxy ( MSDN ).

  • Utilizzare i controller asincroni per implementare azioni che dipendono dall'elaborazione di risorse esterne.

Dalla parte del cliente

  • Ottimizza il tuo lato client, utilizza uno strumento come YSlow per suggerimenti per migliorare le prestazioni
  • Utilizzare AJAX per aggiornare i componenti dell'interfaccia utente, evitare un intero aggiornamento della pagina quando possibile.
  • Prendi in considerazione l'implementazione di un'architettura pub-sub-Comet- per la consegna dei contenuti da ricaricare in base a timeout.
  • Se possibile, spostare la logica di creazione di grafici e grafici sul lato client. La generazione di grafici è un'attività costosa. Il differimento sul lato client del server da un onere non necessario e consente di lavorare con i grafici a livello locale senza effettuare una nuova richiesta (ad esempio grafici Flex, jqbargraph , MoreJqueryCharts ).
  • Utilizzare CDN per script e contenuti multimediali per migliorare il caricamento sul lato client (ad esempio Google CDN )
  • Minimizza - Compila - il tuo JavaScript per migliorare le dimensioni dello script
  • Mantenere le dimensioni dei cookie ridotte, poiché i cookie vengono inviati al server ad ogni richiesta.
  • Prendi in considerazione l'utilizzo di DNS e Prefetching dei link, quando possibile.

Configurazione globale

  • Se si utilizza Razor, aggiungere il codice seguente in global.asax.cs, per impostazione predefinita, Asp.Net MVC esegue il rendering con un motore aspx e un motore rasoio. Questo utilizza solo RazorViewEngine.

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

  • Aggiungi gzip (compressione HTTP) e cache statica (immagini, css, ...) nel tuo web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Rimuovere i moduli HTTP non utilizzati
  • Svuota il tuo HTML non appena viene generato (nel tuo web.config) e disabilita viewstate se non lo stai usando <pages buffer="true" enableViewState="false">

6
aspetta che intenda perdere prestazioni quando, ad esempio, ho una vista che mostra un set di risultati irritando tramite un IList e chiamo Render.PartialView ("Riga", elemento) per ogni elemento dell'elenco? quanto perdo? o come posso misurare il guadagno delle prestazioni?
marc.d

@SDReyes - qual è il significato dell'architettura sub-pub ?
Mohammed Zameer il

1
Questo è fico. Il link di Uber Profiler è morto però. Dovrebbe invece essere collegato a uno dei profilatori specifici ORM?
Shanabus,

12

Il suggerimento di base è seguire i principi REST e i seguenti punti legano alcuni di questi principi al framework ASP.NET MVC:

  1. Rendi i tuoi controller senza stato : si tratta più di un suggerimento "Prestazioni Web / scalabilità" (al contrario delle prestazioni a livello di micro / macchina) e una decisione di progettazione importante che influirebbe sul futuro delle tue applicazioni, specialmente nel caso in cui diventasse popolare o se ne avessi bisogno tolleranza agli errori, ad esempio.
    • Non utilizzare sessioni
    • Non utilizzare tempdata, che utilizza sessioni
    • Non tentare di "memorizzare in cache" tutto "prematuramente".
  2. Usa autenticazione moduli
    • Conserva i dati sensibili a cui accedi frequentemente nel ticket di autenticazione
  3. Utilizzare i cookie per informazioni non sensibili a cui si accede frequentemente
  4. Rendi le tue risorse personalizzabili sul Web
  5. Compila il tuo JavaScript. C'è anche la libreria del compilatore di chiusura per farlo (certo che ce ne sono altri, basta cercare anche 'compilatore JavaScript' )
  6. Usa CDN (Content Delivery Network), specialmente per i tuoi file multimediali di grandi dimensioni e così via.
  7. Prendi in considerazione diversi tipi di archiviazione per i tuoi dati, ad esempio file, archivi chiave / valore, ecc., Non solo SQL Server
  8. Ultimo ma non meno importante, prova le prestazioni del tuo sito web

10

Code Climber e questo post di blog forniscono modi dettagliati per aumentare le prestazioni dell'applicazione.

La query compilata aumenterà le prestazioni dell'applicazione, ma non ha nulla in comune con ASP.NET MVC. Accelererà ogni applicazione db, quindi non riguarda MVC.


8

Ciò può sembrare ovvio, ma esegui il tuo sito in modalità Rilascio, non in modalità Debug, durante la produzione e anche durante la profilazione delle prestazioni. La modalità di rilascio è molto più veloce. La modalità debug può nascondere problemi di prestazioni nel tuo codice.



6

Non un'ottimizzazione sconvolgente, ma ho pensato di lanciarlo là fuori: usa i CDN per jQuery, ecc .

Citazione dello stesso ScottGu: The Microsoft Ajax CDN consente di migliorare significativamente le prestazioni dei moduli Web ASP.NET e delle applicazioni MVC ASP.NET che utilizzano ASP.NET AJAX o jQuery. Il servizio è disponibile gratuitamente, non richiede alcuna registrazione e può essere utilizzato per scopi sia commerciali che non commerciali.

Usiamo persino la CDN per le nostre webpart in Moss che usano jQuery.


6

Inoltre, se si utilizza NHibernate è possibile attivare e configurare la cache di secondo livello per le query e aggiungere all'ambito e al timeout delle query. E c'è un profiler di calcio per EF , L2S e NHibernate - http://hibernatingrhinos.com/products/UberProf . Aiuterà a mettere a punto le tue domande.


Ayende ha recentemente pubblicato un blog su come EF Profiler lo ha aiutato a mettere a punto un'app MVC di esempio: ayende.com/Blog/archive/2010/05/17/…
Frank Schwieterman,

5

Aggiungerò anche:

  1. Usa gli sprite : gli sprite sono un'ottima cosa per ridurre una richiesta. Unisci tutte le tue immagini in una singola e usi CSS per arrivare a buona parte dello sprite. Microsoft fornisce una buona libreria per farlo: Sprite e Image Optimization Preview 4 .

  2. Cache Il tuo oggetto server : se hai alcuni elenchi di riferimenti o dati che cambieranno raramente, puoi memorizzarli nella memoria invece di interrogare il database ogni volta.

  3. Usa ADO.NET invece di Entity Framework : EF4 or EF5sono ottimi per ridurre i tempi di sviluppo, ma sarà doloroso ottimizzare. È più semplice ottimizzare una stored procedure rispetto a Entity Framework. Quindi dovresti usare le procedure del negozio il più possibile. Dapper offre un modo semplice per eseguire query e mappare SQL con prestazioni molto buone.

  4. Pagina cache o pagina parziale : MVC fornisce alcuni semplici filtri per memorizzare nella cache la pagina in base ad alcuni parametri, quindi usalo.

  5. Riduzione delle chiamate al database : è possibile creare una richiesta di database univoca che restituisce più oggetti. Controlla sul sito Dapper.

  6. Avere sempre un'architettura pulita : avere un'architettura n-tier pulita, anche su un piccolo progetto. Ti aiuterà a mantenere pulito il tuo codice e, se necessario, sarà più facile ottimizzarlo.

  7. Puoi dare un'occhiata a questo modello " Neos-SDI MVC Template " che creerà un'architettura pulita per te con molti miglioramenti delle prestazioni di default (controlla il sito Web MvcTemplate ).


Pensi che sia meglio eseguire una procedura memorizzata che restituisce più set di risultati ed eseguire più procedure memorizzate in modalità asincrona?
Muflix,

4

Oltre a tutte le fantastiche informazioni sull'ottimizzazione della tua applicazione sul lato server, direi che dovresti dare un'occhiata a YSlow . È una risorsa eccezionale per migliorare le prestazioni del sito sul lato client.

Questo vale per tutti i siti, non solo per ASP.NET MVC.


3

Una cosa semplicissima da fare è pensare in modo asincrono quando si accede ai dati desiderati per la pagina. Che tu stia leggendo da un servizio web, un file, una base di dati o qualcos'altro, usa il modello asincrono il più possibile. Anche se non aiuterà necessariamente una pagina a essere più veloce, aiuterà il tuo server a funzionare meglio nel complesso.


2

1: Ottieni orari. Fino a quando non sai dove si trova il rallentamento, la domanda è troppo ampia per rispondere. Un progetto a cui sto lavorando ha questo preciso problema; Non ci sono registrazioni per sapere quanto tempo impiegano certe cose; possiamo solo indovinare le parti lente dell'app fino a quando non aggiungiamo i tempi al progetto.

2: Se hai operazioni sequenziali, non aver paura di eseguire il multithreading. Soprattutto se sono coinvolte operazioni di blocco. PLINQ è il tuo amico qui.

3: Pregenerare le visualizzazioni MVC durante la pubblicazione ... Ciò contribuirà ad alcuni dei "risultati della prima pagina"

4: Alcuni sostengono la procedura memorizzata / i vantaggi ADO della velocità. Altri sostengono per la velocità di sviluppo di EF e una più chiara seprataion di livelli e il loro scopo. Ho visto progetti molto lenti quando SQL e le soluzioni alternative utilizzavano Sprocs / Views per il recupero e l'archiviazione dei dati. Inoltre, la tua difficoltà di test aumenta. La nostra base di codice attuale che stiamo convertendo da ADO a EF non sta ottenendo risultati peggiori (e in alcuni casi migliori) rispetto al vecchio modello a rotazione manuale.

5: Detto questo, pensa al riscaldamento dell'applicazione. Parte di ciò che facciamo per aiutare a eliminare la maggior parte dei nostri problemi di prestazioni EF è stato l'aggiunta di uno speciale metodo di riscaldamento. Non precompila alcuna query o altro, ma aiuta con gran parte del caricamento / generazione dei metadati. Questo può essere ancora più importante quando si ha a che fare con i modelli Code First.

6: Come altri hanno già detto, non utilizzare lo stato della sessione o ViewState se possibile. Non sono necessariamente ottimizzazioni delle prestazioni a cui pensano gli sviluppatori, ma una volta che inizi a scrivere applicazioni Web più complesse, vuoi reattività. Lo stato della sessione lo preclude. Immagina una query di lunga durata. Decidi di aprire una nuova finestra e provare una meno complessa. Bene, potresti anche aver atteso con lo stato della sessione attivo, perché il server attenderà fino a quando la prima richiesta non viene eseguita prima di passare alla successiva per quella sessione.

7: ridurre a icona i viaggi di andata e ritorno nel database. Salva le cose che usi frequentemente ma che non cambieranno realisticamente nella tua .Net Cache. Prova a raggruppare inserti / aggiornamenti ove possibile.

7.1: Evitare il codice di accesso ai dati nelle viste Razor senza una ragione dannatamente buona. Non lo direi se non l'avessi visto. Stavano già accedendo ai loro dati quando hanno messo insieme il modello, perché diavolo non lo stavano includendo nel modello?


2
  1. Implementa Gzip.
  2. Utilizza il rendering asincrono per le viste parziali.
  3. Ridurre al minimo gli accessi al database.
  4. Utilizzare una query compilata.
  5. Esegui un profiler e scopri i risultati non necessari. Ottimizza tutte le procedure memorizzate che impiegano più di 1 secondo per restituire una risposta.
  6. Usa la memorizzazione nella cache.
  7. Utilizza l' ottimizzazione della minificazione del raggruppamento .
  8. Usa utility HTML 5 come cache di sessione e archiviazione locale per contenuti di sola lettura.

2

Volevo solo aggiungere i miei 2 centesimi. Il modo più efficace per ottimizzare la generazione della route URL in un'applicazione MVC è ... non generarli affatto.

La maggior parte di noi sa più o meno come vengono generati gli URL nelle nostre app, quindi semplicemente usando statico Url.Content("~/Blahblah")invece Url.Action()o Url.RouteUrl()dove possibile, batte tutti gli altri metodi di quasi 20 volte e anche di più.

PS. Ho eseguito un benchmark di un paio di migliaia di iterazioni e pubblicato risultati sul mio blog, se interessati.


1

Nel tuo clamore per ottimizzare il lato client, non dimenticare il livello del database. Abbiamo avuto un'applicazione che è durata da 5 secondi per caricare fino a 50 secondi durante la notte.

All'ispezione, abbiamo apportato un sacco di modifiche allo schema. Una volta aggiornate le statistiche, è diventata improvvisamente reattiva come prima.


0

Di seguito sono cose da fare

  1. Cache in modalità kernel
  2. Modalità pipeline
  3. Rimuovere i moduli non utilizzati
  4. runAllManagedModulesForAllRequests
  5. Non scrivere in wwwroot
  6. Rimuovi i motori di visualizzazione e la lingua non utilizzati

0

L'uso di Bundling e Minification ti aiuta anche a migliorare le prestazioni. Riduce sostanzialmente il tempo di caricamento della pagina.


0

Se si esegue l'applicazione ASP.NET MVC su Microsoft Azure (IaaS o PaaS), eseguire almeno quanto segue prima della prima distribuzione.

  • Scansiona il tuo codice con l'analizzatore di codice statico per qualsiasi tipo di debito, duplicazione, complessità e sicurezza del codice.
  • Abilitare sempre Application Insight e monitorare frequentemente le prestazioni, i browser e le analisi per individuare i problemi in tempo reale nell'applicazione.
  • Implementare Azure Redis Cache per dati di modifica statici e meno frequenti come immagini, risorse, layout comuni ecc.
  • Affidati sempre agli strumenti APM (Application Performance Management) forniti da Azure.
  • Vedi frequentemente la mappa dell'applicazione per esaminare le prestazioni di comunicazione tra le parti interne dell'applicazione.
  • Monitora anche le prestazioni del database / VM.
  • Utilizzare Load Balancer (scala orizzontale) se necessario e nel budget.
  • Se l'applicazione ha il pubblico di destinazione in tutto il mondo, usare Azure Trafic Manager per gestire automaticamente la richiesta in arrivo e dirottarla sull'istanza dell'applicazione più disponibile.
  • Prova ad automatizzare il monitoraggio delle prestazioni scrivendo gli avvisi in base a basse prestazioni.

0

Utilizzare l'ultima versione di Task Parallel Library (TPL) , secondo la versione .Net. Devi scegliere i moduli corretti di TPL per scopi diversi.


0

Ho fatto tutte le risposte sopra e non ha risolto il mio problema.

Infine, ho risolto il mio lento problema di caricamento del sito impostando PrecompileBeforePublish in Publish Profile su true . Se vuoi usare msbuild puoi usare questo argomento:

 /p:PrecompileBeforePublish=true

Aiuta davvero molto. Ora il mio MVC ASP.NET si carica 10 volte più velocemente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.