Prestazioni ASP.NET MVC


102

Ho trovato alcune osservazioni selvagge che ASP.NET MVC è 30 volte più veloce di ASP.NET WebForms. Qual è la differenza di prestazioni reale, è stata misurata e quali sono i vantaggi in termini di prestazioni.

Questo per aiutarmi a considerare il passaggio da ASP.NET WebForms a ASP.NET MVC.


20
Dopo aver lavorato con WebForms da quando sono usciti, non tornerò mai più volentieri! MVC ha rubato il mio <3 - e questo sito funziona alla grande sulla Beta 5!
Jarrod Dixon

2
Cosa sono tutti i rollback di revisione su questa domanda ..?
Nick

@ Nick: L'OP sta annullando le modifiche e cancellando tutti i commenti che le spiegano.
GEOCHET

@Rich B: corretto, ha cancellato circa 5 dei miei commenti.
George Stocker,

2
Ha bisogno di un aggiornamento ora che ci stiamo avvicinando al rilascio di MVC3.
Andrew Lewis

Risposte:


69

Non abbiamo eseguito il tipo di test di scalabilità e prestazioni necessari per trarre conclusioni. Penso che ScottGu possa aver discusso dei potenziali obiettivi di prestazione. Man mano che ci spostiamo verso Beta e RTM, effettueremo internamente più test delle prestazioni. Tuttavia, non sono sicuro di quale sia la nostra politica sulla pubblicazione dei risultati dei test di prestazione.

In ogni caso, tali test devono davvero considerare le applicazioni del mondo reale ...


13
Ora che MVC è stato rilasciato, c'è qualche aggiornamento sul rilascio dei risultati perf?
chris

6
Ho solo votato perché il punteggio di 5.999 ripetizioni prima mi faceva male agli occhi :(
Damien

2
A questo punto, devi sicuramente avere dei numeri. Ti interessa aggiornare la tua risposta? O hai scoperto che la fastidiosa politica lo vieta?
tvanfosson

7
Il numero è 42. :) In generale, i nostri numeri saranno probabilmente inutili per le app del mondo reale, quindi di regola non li distribuiamo. Tuttavia, conosco altri team di Microsoft che creano siti Web su larga scala che mostrano numeri favorevoli. In altre parole, è più probabile che eventuali problemi di prestazioni siano dovuti a errori del programmatore rispetto a qualsiasi problema di ereditarietà nel framework. In genere i colpevoli sono le interazioni con il database e i servizi esterni. :)
Haacked il

Vero! Per favore aggiorna questo! Forse non i benchmark ma una breve idea, sono alla pari o mvc è un po 'meglio su perf?
gideon

48

Penso che questa sarà una domanda difficile a cui rispondere in modo definitivo poiché molto dipenderà da A) come implementerai l'applicazione WebForms e B) come implementerai l'applicazione MVC. Nei loro formati "grezzi", MVC è probabilmente più veloce di WebForms, ma anni e anni di strumenti ed esperienza hanno prodotto una serie di tecniche per la creazione di applicazioni WebForms veloci. Sarei disposto a scommettere che uno sviluppatore ASP.NET senior potrebbe produrre un'applicazione WebForms che rivaleggia con la velocità di qualsiasi applicazione MVC, o almeno raggiungere una differenza trascurabile.

La vera differenza, come suggerito da @tvanfosson , è nella testabilità e nel SoC pulito. Se il miglioramento delle prestazioni è la tua preoccupazione principale, non penso sia un ottimo motivo per saltare la nave su WebForms e iniziare a ricostruire in MVC. Almeno fino a quando non avrai provato le tecniche disponibili per l'ottimizzazione dei WebForm.


Ottima risposta Todd (che sorpresa per un evangelista sviluppatore avere effettivamente una risposta pragmatica). L'unica cosa che hai sbagliato è che il modulo web delle implementazioni non elaborate è effettivamente sostanzialmente più veloce.
Chris Marisic

42

Ha ridotto una delle mie pagine da 2MB a 200k, semplicemente eliminando il viewstate e rendendo sopportabile a livello di programmazione lavorare con l'output inviato.

La sola dimensione, anche se l'elaborazione è stata la stessa, creerà enormi miglioramenti nelle connessioni al secondo e nella velocità delle richieste.


31
avresti potuto aggiustare quel fastidioso grande stato di visualizzazione anche senza MVC
Andrei Rînea

1
Solo per elaborare ViewState può essere disattivato a livello di pagina o in web.config
bbqchickenrobot

8
sì, ma in mvc è una sana impostazione predefinita, non una decisione progettuale che ti costringe a lasciare tutti i controlli e i fornitori che affermano di lavorare solo sui moduli web, facendo in modo che i moduli web "si comportino male" rimuovendone la spina dorsale. Non sono d'accordo che potresti ricodificare quella pagina, ma l'intera app era migliore senza viewstate.
DevelopingChris

allora non pensi che sia la tua peggiore decisione portare l'intera app su MVC invece di disattivare il viewstate in web.config? e no, viewstate non è la spina dorsale. solo se hai effettuato ricerche, viewstate può essere mantenuto nella cache così come nelle sessioni.
Simple Fellow

29

Penso che molte delle persone che pensano che i WebForm siano intrinsecamente lenti o che richiedono molte risorse stiano mettendo la colpa nel posto sbagliato. 9 volte su 10 quando vengo chiamato per ottimizzare un'app di moduli web, ci sono troppi posti in cui gli autori delle app fraintendono lo scopo del viewstate. Non sto dicendo che il viewstate sia perfetto o altro, ma è troppo facile abusarne, ed è questo abuso che sta causando il campo di viewstate gonfio.

Questo articolo è stato prezioso per aiutarmi a capire molti di questi abusi. https://weblogs.asp.net/infinitiesloop/truly-understanding-viewstate

Per fare un confronto valido tra MVC e WebForms dobbiamo essere sicuri che entrambe le app utilizzino correttamente le architetture.


14

I miei test mostrano qualcosa tra 2x e 7 volte più req / sec su MVC, ma dipende da come costruisci la tua app webforms. Con solo il testo "ciao mondo" su di esso, senza alcun controllo lato server, mvc è circa il 30-50% più veloce.


12

Per me il vero miglioramento delle "prestazioni" in MVC è l'aumento della superficie testabile dell'applicazione. Con WebForms c'erano molte applicazioni difficili da testare. Con MVC la quantità di codice che diventa testabile sostanzialmente raddoppia. Fondamentalmente tutto ciò che non è facilmente testabile è il codice che genera il layout. Tutta la logica aziendale e la logica di accesso ai dati, inclusa la logica che popola i dati effettivi utilizzati nella vista, è ora suscettibile di test. Anche se mi aspetto che sia anche più performante - il ciclo di vita della pagina è notevolmente semplificato e più adatto alla programmazione web - anche se fosse lo stesso o un po 'più lento varrebbe la pena passare da una prospettiva di qualità.


Mi piacerebbe davvero sapere perché qualcuno ha svalutato questa risposta.
tvanfosson

La mia sensazione è che potrebbe essere sottovalutato perché un'applicazione di moduli Web ASP.NET ben progettata è testabile tanto quanto un'applicazione MVC. La mia esperienza nello sviluppo di entrambi è che MVC ti costringe a un modello di programmazione pulito (che è uno dei suoi maggiori punti di forza, IMO). I moduli Web ti consentono di fare cose più pigre, ma è ancora molto possibile avere la stessa superficie testabile nei moduli Web. Questa è la mia ipotesi, comunque.
dudemonkey

Le visualizzazioni Razor incoraggiano letteralmente l'incorporamento del codice all'interno della visualizzazione. Non è verificabile e non è di buon auspicio per la separazione delle preoccupazioni. Solo perché MVC ti fa scrivere controller, non significa che non puoi rimediare tutto se non sai cosa stai facendo. Uno sviluppatore esperto otterrà le stesse prestazioni da WebForms (o più) di MVC e avrà una "superficie verificabile" praticamente identica.
Richard Hauer

@RichardHauer che non era letteralmente vero quando ho scritto questo, ma hanno migliorato quello. Poiché WebForms non sembra avere un futuro in .NET Core, sembra essere un punto controverso.
tvanfosson

@tvanfosson concordato - ora è discutibile. Non sei sicuro di quale bit pensi non sia vero, forse ti opponi al mio uso di "letteralmente"? Ad ogni modo, le versioni più recenti di MVC con TagHelpers aiutano a rompere l'abitudine di inserire codice nei layout che potrebbero finalmente far funzionare tutto per me. Apprezzare questo post è abbastanza vecchio ovviamente, ma anche al momento, un modulo WebForm ben costruito è molto veloce senza il "cablaggio magico" di MVC e nessun codice incorporato nella vista.
Richard Hauer

7

Penso che il problema qui sia che non importa quanto sia più veloce ASP.Net MVC rispetto ai vecchi webform, non farà la differenza, perché la maggior parte del tempo impiegato è nel database. Il più delle volte, i tuoi server web saranno seduti allo 0-10% di utilizzo della CPU solo in attesa del tuo server database. A meno che tu non ottenga un numero estremamente elevato di visite sul tuo sito web e il tuo database sia estremamente veloce, probabilmente non noterai una grande differenza.


I tuoi utenti potrebbero - no viewstate.
UpTheCreek

6

Gli unici numeri concreti che posso trovare che provengono dallo sviluppo iniziale di ASP.NET MVC sono su questo thread del forum:

http://forums.asp.net/p/1231621/2224136.aspx

Lo stesso Rob Connery conferma in qualche modo l'affermazione secondo cui ScottGu ha affermato che ASP.NET MVC può servire 8000 richieste al secondo.

Forse Jeff e la sua troupe possono dare qualche suggerimento dal loro sviluppo di questo sito.


3

Contrariamente all'opinione accettata, l'utilizzo ottimizzato dei moduli web uccide completamente MVC in termini di prestazioni grezze. Webforms è stato iper-ottimizzato per il compito di servire html molto più a lungo di MVC.

Le metriche sono disponibili su http://www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=db

Ogni singolo mvc di confronto si trova nelle classifiche inferiore-media / inferiore-superiore dell'elenco, mentre l'utilizzo di moduli web ottimizzati si colloca nelle classifiche superiore-centrale / superiore-inferiore.

Convalida aneddotica ma molto seria di queste metriche, www.microsoft.com è servito da moduli web non MVC. Qualcuno qui crede che non avrebbe scelto MVC se fosse stato empiricamente più veloce?


2

Non c'è davvero modo di rispondere a questo. MVC utilizza il motore di visualizzazione Web Form per impostazione predefinita e può essere configurato per utilizzare un numero qualsiasi di motori di visualizzazione personalizzati, quindi se si desidera un confronto delle prestazioni è necessario essere più specifici.


2

Ho iniziato a lavorare in MVC circa un anno fa, sono stato ispirato ma non colpito.

Detesto lo stato di visualizzazione e lo vedo come la radice di tutti i mali in termini di ASP.NET. Questo è il motivo per cui non lo uso e ad essere perfettamente onesto perché dovresti?

Ho preso fondamentalmente il concetto di ASP.NET MVC Framework e l'ho costruito a modo mio. Ho cambiato un paio di cose però. Ho creato il codice di wrapping del controller o il codice di routing dell'URL attorno alla ricompilazione dinamica.

Ora, vorrei arrivare a dire che le applicazioni ASP.NET MVC saranno più veloci in base a come le usi. Se abbandoni completamente WebForms sarai più veloce perché il ciclo di vita di ASP.NET e il modello a oggetti sono enormi.

Quando scrivi, crei un'istanza di un esercito ... no aspetta, una legione di oggetti che parteciperanno al rendering della tua vista. Questo sarà più lento rispetto a dove esprimere la quantità minima di comportamento nella pagina ASPX stessa. (Non mi interessa l'astrazione del motore di visualizzazione perché il supporto per le pagine ASPX in Visual Studio è decente, ma ho completamente abbandonato WebForms come concetto e fondamentalmente qualsiasi framework ASP.NET a causa del codice gonfio o dell'impossibilità di modificare il cose che collegano la mia applicazione).

Ho trovato il modo di fare affidamento sulla ricompilazione dinamica (System.Reflection.Emit) per l'emissione di oggetti e codice per scopi speciali quando necessario. L'esecuzione di questo codice è più veloce della reflection ma inizialmente costruita tramite il servizio di reflection. Questo ha dato al mio framework in stile MVC ottime prestazioni ma anche tipizzato in modo molto statico. Non uso stringhe e raccolte di coppie nome / valore. Invece i miei servizi di compilazione personalizzati vanno in una riscrittura di un modulo post in un'azione del controller che viene passata un tipo di riferimento. Dietro le quinte stanno succedendo molte cose ma questo codice è veloce, molto più veloce di WebForms o MVC Framework.

Inoltre, non scrivo URL, scrivo espressioni lambda che vengono tradotte in URL che in seguito indicano quale azione del controller richiamare. Non è particolarmente veloce, ma batte avere URL non funzionanti. È come se avessi risorse digitate staticamente e oggetti digitati staticamente. Un'applicazione web di tipo statico? Questo è quello che voglio!

Incoraggerei più persone a provarlo.


2
Quindi questa non è una risposta diretta alla domanda? È comunque correlato e fa un paio di buoni punti. Ma hey, è qualcosa che ho costruito per le mie esigenze e mi sta perfettamente bene. Mi piace anche condividere le mie idee, anche se pochissime persone ne capiscono il motivo.
John Leidegren,

1
Bene, non devi cambiare il tuo voto, ma non devi votarlo per difetto, perché non è "la" risposta. Se dai un'occhiata al testo, ci sono molte cose che indicano che ASP.NET MVC è più veloce di WebForm e perché è così. E si riduce a cose come la riflessione e il modello a oggetti e il sovraccarico di ViewState di WebForms.
John Leidegren

@ John - ora che MVC2 è uscito con associazione di modelli migliorata, convalida, helper fortemente tipizzati, ecc., Come lo valuteresti rispetto al tuo metodo?
tvanfosson

MVC2 è molto meglio, credo che abbia praticamente sostituito ciò che stavo costruendo in quel momento (con MVC1 in beta). Mi sono imbattuto in una serie di problemi in relazione a ciò che stavo cercando di creare su ASP.NET senza rinunciare agli strumenti esistenti. Sufficiente da dire, ho imparato molto e alla fine l'ho portato in produzione. Ora mi rendo conto che l'attuale tooling / framework (VS / ASP.NET / C #) non è veramente adatto a queste cose e alla fine se vuoi percorrere questa strada, dovrai investire nei tuoi compilatori / controllo del modello cose perché alcune cose funzionino a tuo favore.
John Leidegren

A quel tempo non pensavo molto ad ASP.NET MVC. Mancavano le cose che sapevo di volere. Ma ho dovuto passare molto tempo a sviluppare, testare e capire queste cose. Penso ancora che l'aspetto statico del framework web che stavo costruendo sia superiore a MVC in questo senso, ma il compilatore C # è inefficiente per risolvere il problema. Hai bisogno di un linguaggio / compilatore che consenta una maggiore flessibilità quando si tratta di meta programmazione. Ho dovuto eseguire molte operazioni in fase di esecuzione ed era spesso impossibile memorizzare nella cache istanze compilate, quindi ho dovuto ricompilare dinamicamente molte cose.
John Leidegren

2

I progetti realizzati con visual studio. Uno è il modello mvc4, un altro è WebForm (tranditional). E quando si effettua un test di carico con WCAT, questo è il risultato,

MVC4 è piuttosto lento rispetto a WebForm, qualche idea?

inserisci qui la descrizione dell'immagine

MVC4

  • potrebbe ottenere circa 11 rps
  • rps è piuttosto basso sia per server da 2 cpu che da 4 cpu

inserisci qui la descrizione dell'immagine

WebForms (aspx)

  • potrebbe superare i 2500 rps

  • il killer delle prestazioni è stato scoperto che è un bug di MVC Bata o RC. E le prestazioni sarebbero migliorate una volta rimosso le cose dei bundle. Ora l'ultima versione ha risolto questo problema.


1

Le prestazioni dipendono da ciò che stai facendo ... Di solito MVC è più veloce di asp.net principalmente perché Viewstate è assente e perché MVC funziona di più con Callback che Postback per impostazione predefinita.

Se ottimizzi la tua pagina webform puoi avere le stesse prestazioni di MVC ma richiederà molto lavoro.

Inoltre, ci sono molti nuget per MVC (e anche per Webform) per aiutarti a migliorare le prestazioni del sito web come combinare e minimizzare i tuoi css e javascript, raggruppare le tue immagini e usarle come sprite e così via.

Le prestazioni del sito web dipendono in gran parte dalla tua architettura. Uno pulito con una buona separazione delle preoccupazioni ti offrirà un codice più pulito e un'idea migliore di come migliorare le prestazioni.

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


-1

inserisci qui la descrizione dell'immagine

Ho eseguito un piccolo esperimento di test di carico VSTS con del codice di base e ho riscontrato che il tempo di risposta di ASP.NET MVC è due volte più veloce rispetto a ASP.NET Webforms. Sopra è il grafico allegato con la trama.

Puoi leggere questo esperimento di test di carico in dettaglio da questo articolo CP https://www.codeproject.com/Articles/864950/ASP-NET-MVC-vs-ASP-NET-WebForm-performance-compari

Il test è stato condotto con le specifiche seguenti utilizzando VSTS e il software di test di carico telerik: -

Carico utente 25 utenti.

La durata del test è stata di 10 minuti.

Configurazione macchina DELL 8 GB Ram, Core i3

Il progetto è stato ospitato in IIS 8.

Il progetto è stato creato utilizzando MVC 5.

È stata presunta una connessione LAN di rete. Quindi questo test non tiene conto del ritardo di rete per ora.

Il browser nel test ha selezionato Chrome e Internet Explorer.

Letture multiple sono state prese durante il test per calcolare la media di eventi sconosciuti. 7 letture dove sono state effettuate e tutte le letture sono pubblicate in questo articolo come letture 1, 2 e così via.


La tua metodologia di test è pessima e fortemente distorta e le tue conclusioni non sono valide. Un'applicazione WebForms costruita correttamente è testabile, ha un'adeguata separazione delle preoccupazioni e ha un sovraccarico di carico minimo. Sebbene MVC non abbia un ciclo di eventi del ciclo di vita della pagina, ha il routing e l'esecuzione della visualizzazione con cui confrontarsi. I tuoi articoli su questo argomento su CP sono fortemente prevenuti.
Richard Hauer

Un'applicazione costruita correttamente e con cura anche con una tecnologia peggiore farebbe miracoli. Il ciclo di vita della pagina ASP.NET ha sicuramente un carico utile maggiore rispetto al routing e all'esecuzione della visualizzazione poiché si occupa della generazione dell'interfaccia utente HTML. Il routing fa parte del framework ASP.NET quindi anche nei normali webforms esistono. Una cosa su cui sono d'accordo se non scrivi codice dietro le tue prestazioni sarà equivalente a MVC, ma il toolbox Webform è così allettante che il codice dietro diventa parte integrante di esso. Anche se MVC non me lo consente affatto. Adoro il modo in cui in Razor hanno disabilitato la visualizzazione del design e il codice sottostante.
Shivprasad Koirala
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.