2010-09-02 9 views
19

Ich gerade zufällig, um die Leistung einer ASP.NET MVC-Anwendung zu überprüfen, die wir erstellen. Ich wollte eine Teilansicht in eine Schleife einfügen, und gerade aus Neugierde prüfte ich, wie lange es dauerte, die Seite zu rendern. Das Ergebnis war nicht gut.ASP.NET MVC Teilansichten langsam?

Ich muss mehr abschließende Untersuchung tun, aber nur für den Fall, dass jemand mit ähnlichen Problemen oder mehr Einblick, hier ist, was ich bisher habe. Zuerst sollte ich sagen, dass alle Ergebnisse und Messungen nach dem Laden mehrerer Seiten durchgeführt wurden und dass ich <compilation debug="false"> in meiner web.config eingestellt habe.

  • Es scheint, dass ein einzelnes Rendern teilweise ca. 5ms Treffer (mindestens in meiner Umgebung) verursacht. Wenn ich den eigentlichen Inhalt der Teilansicht einfasse, bekomme ich praktisch 0ms.
  • Wenn ich eine leere Teilansicht in eine Schleife mit etwa 70 Elementen einfüge, erhöht sich die gesamte Renderzeit um ~ 60 ms. Es gibt also vermutlich etwas Caching, aber es ist nicht ideal.
  • Ich debuggte ASP.NET MVC und fand heraus, dass Teilansichten zwischengespeichert werden, aber es speichert nur die Pfade zu den Ascx. Die tatsächlichen Ansichten werden dann jedes Mal unter Verwendung der Methode BuildManager.CreateInstanceFromVirtualPath instanziiert.
  • Und jetzt das interessante Bit: Wenn die gleiche Teilansicht mit der WebForms-Syntax (<my:UserContol runat="server" />) enthalten, gehen die zusätzlichen 60ms weg.
  • Basierend auf den obigen Beobachtungen, scheint es der Täter ist die BuildManager.CreateInstanceFromVirtualPath-Methode. Vielleicht sollte es nicht mehrmals aufgerufen werden. Webforms verwenden es vermutlich nicht; oder benutze es irgendwie nur einmal für jeden ascx?

    +0

    Also, Ihre Frage ist; sind Teilansichten langsamer als inline Inhalt, auf den Sie bereits die Antwort haben. :) – bzlm

    +0

    Die Frage war, ob es möglich ist, die gleiche Leistung wie in Webforms zu erhalten. –

    +3

    60ms ist nicht langsam für mich. – jfar

    Antwort

    2

    Ich vermute die Antwort ist ... es hängt davon ab?

    Teilansichten verringern die Leistung (der Overhead des tatsächlichen Anrufs usw.).

    Teilansichten werden nicht zwischengespeichert.

    Das Einfügen einer Teilansicht in eine Schleife verringert die Leistung und kann stattdessen durch Verschieben der Schleife innerhalb der Teilansicht beschleunigt werden.

    Einige Beispielwerte (die auf die Zwischenspeicherung des Ansichtspfads verweisen) finden Sie unter here.

    +2

    Das echte Leistung Schwein ist * rekursive Teilansichten *. Während es in einigen Fällen sicherlich ein passendes Konzept ist (ein Baummenü kommt mir in den Sinn), verschlechterte sich die Leistung unerwartet schlechter als linear, als ich es das letzte Mal ausprobierte. – bzlm

    2

    60ms ist so ein kleines Intervall es klingt wie statistisches Rauschen für mich, nicht schlüssigen Beweis für einen Leistungsunterschied.

    +0

    Ich hatte Leistungsprobleme mit Teilansichten/DisplayTemplates, die in einer verschachtelten Art und Weise angeordnet waren. Die Zielseite meiner App dauerte gut 5-10 Sekunden (je nach Daten). Ich habe versucht, debug = false und full paths zu verwenden, um die Suchzeit (n) zu reduzieren, jetzt habe ich die Teil- und Anzeigetemplates entfernt und den gesamten Rasierer in die Einzelansicht eingefügt. Dies ist auf einer ziemlich schweren Seite mit vielen Ebenen verschachtelter Elemente. Den Rest der Zeit liebe ich die Displaytemplates und Teilansichten - aber in diesem Fall musste ich sie optimieren. – MemeDeveloper

    8

    Ich habe gerade eine MVC2 Ansicht von der Verwendung einer Teilansicht in einer Schleife zu einer einzigen Ansicht geändert wird, das heißt:

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

    Wo SomePartialView den Code enthält eine einzelne Zeile in einer Tabelle zu machen, z.B. :

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

    zu:

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

    für eine Ansicht Rendering 900 Zeilen der Zeit Seite machen ging von 5+ Minuten Seite Last auf weniger als 30 Sekunden, ziemlich schlüssiger Beweis, dass es ein erheblicher Aufwand wenn Teilansichten aufgerufen werden. Ich bin sicher, dass dies vernachlässigbar ist, wenn Sie einen einzigen Anruf haben, aber in einer Schleife addiert sich alles, so dass ich empfohlen habe, Teilansichten in einer Schleife zu vermeiden, wenn möglich.