2010-09-02 20 views
19

Mi capita di controllare le prestazioni di un'applicazione ASP.NET MVC che stiamo costruendo. Stavo per inserire una vista parziale in un loop, e per curiosità ho controllato quanto tempo ci voleva per rendere la pagina. Il risultato non è stato buono.Visualizzazioni parziali ASP.NET MVC lente?

Ho bisogno di fare più indagini conclusive, ma nel caso ci fosse qualcuno con problemi simili o più approfondimenti, ecco quello che ho finora. Innanzitutto, dovrei dire che tutti i risultati e le misurazioni sono stati eseguiti dopo il caricamento di più pagine e che ho impostato <compilation debug="false"> nel mio web.config.

  • Sembra che un solo rendering parziale incida circa 5 ms di hit (almeno nel mio ambiente). Quando inserisco il contenuto effettivo della vista parziale, ottengo praticamente 0 ms.
  • Quando includo una vista parziale vuota su un ciclo di circa 70 elementi, il tempo di rendering totale aumenta di ~ 60 ms. Quindi c'è presumibilmente del caching, ma non è l'ideale.
  • Ho eseguito il debug di ASP.NET MVC e ho scoperto che le viste parziali sono memorizzate nella cache, ma memorizza solo i percorsi degli ascx. Le viste effettive vengono quindi istanziate ogni volta utilizzando il metodo BuildManager.CreateInstanceFromVirtualPath.
  • E ora il bit interessante: quando includi la stessa vista parziale usando la sintassi WebForms (<my:UserContol runat="server" />), gli extra 60ms vanno via.

Quindi, in base alle osservazioni precedenti, sembra che il colpevole sia il metodo BuildManager.CreateInstanceFromVirtualPath. Forse, non è stato pensato per essere chiamato più volte. Presumibilmente le Webform non la usano; o usarlo in qualche modo solo una volta per ogni ascx?

+0

Quindi, la tua domanda è; le viste parziali sono più lente dei contenuti inline, a cui hai già la risposta. :) – bzlm

+0

La domanda era se fosse possibile ottenere le stesse prestazioni di in Webforms. –

+3

60 ms non è lento per me. – jfar

risposta

2

Immagino che la risposta sia ... dipende?

Le visualizzazioni parziali riducono le prestazioni (il sovraccarico della chiamata effettiva ecc.).

Le viste parziali non sono memorizzate nella cache.

L'inclusione di una vista parziale all'interno di un loop riduce le prestazioni e può essere aumentata nuovamente spostando il ciclo all'interno della vista parziale.

Alcuni esempi di lettura (che fa riferimento alla memorizzazione nella cache del percorso di visualizzazione) possono essere trovati here.

+2

Il maiale performance reale è * viste parziali ricorsive *. Sebbene sia certamente un concetto appropriato in alcuni casi (mi viene in mente un menu ad albero), le prestazioni sono peggiorate inaspettatamente in modo più lineare rispetto a quando l'ho provato l'ultima volta. – bzlm

2

60 ms è un intervallo così piccolo che suona come rumore statistico per me, non prova evidente di una differenza di prestazioni.

+0

Stavo riscontrando problemi di prestazioni con viste parziali/DisplayTemplates disposti in modo annidato. La pagina di destinazione della mia app ha impiegato ben 5-10 secondi per il rendering (in base ai dati). Ho provato debug = false e percorsi completi per ridurre i tempi di ricerca, ora ho rimosso i partial e displaytemplates e ho messo tutto il rasoio in linea in vista singola. Questo è in una pagina piuttosto pesante con molti livelli di elementi nidificati. Per il resto del tempo amo i displaytemlates e le viste parziali - ma in questo caso avevo bisogno di ottimizzarli. – MemeDeveloper

8

Ho appena cambiato una vista MVC2 di utilizzare una vista parziale in un ciclo per una singola vista, cioè:

<table> 
foreach(var a in items) 
{ 
    <%: Html.Partial("SomePartialView",a) %> 
} 
</table> 

Dove SomePartialView contiene il codice di rendere una singola riga in una tabella, ad esempio :

<tr><td>Model.Name</td><td>Model.description</td></tr> 

a:

foreach(var a in items) 
{ 
    <tr><td>a.Name</td><td>a.description</td></tr> 
} 

per una vista di rendering 900 righe il rendering della pagina ora è andato giù da 5+ minuti caricamento della pagina per meno di 30 secondi, la prova abbastanza conclusiva che v'è una notevole sovraccarico quando si chiamano viste parziali. Sono sicuro che questo è trascurabile quando si ha una singola chiamata, tuttavia in un ciclo tutto si aggiunge quindi ho consigliato di evitare viste parziali in un ciclo, se possibile.

Problemi correlati