Ein kleiner Benchmark mit ASP.NET MVC. Viewpage Code:
public string Bechmark(Func<string> url)
{
var s = new Stopwatch();
var n = 1000;
s.Reset();
s.Start();
for (int i = 0; i < n; i++)
{
var u = url();
}
s.Stop();
return s.ElapsedMilliseconds + " ms, " + ((s.ElapsedMilliseconds) / (float)n) + " ms per link<br/>";
}
Code anzeigen:
<%= Bechmark(() => Url.Action("Login", "Account")) %>
<%= Bechmark(() => Url.Action("Login", "Account", new {username="bla", password="bla2", returnurl="blabla32", rememberme=false} )) %>
<%= Bechmark(() => Html.BuildUrlFromExpression<AccountController>(a=>a.ChangePassword("bla", "bla", "ya")) ) %>
Die Ausführung dieses Vorgangs auf einem typischen Core2-Notebook mit der Standardvorlage für neue Projekte mit ASP.NET MVC Beta führt zu folgenden Ergebnissen:
38 ms, 0,038 ms pro Verbindung
120 ms, 0,12 ms pro Verbindung
54 ms, 0,054 ms pro Verbindung
Bei der Durchführung desselben Benchmarks auf einem Produktionsprojekt mit etwa 10 Controllern, die insgesamt etwa 100 Methoden und 30 Routing-Tabelleneinträge haben, verschlechtert sich die Leistung bei der ausdrucksbasierten Methode erheblich:
31 ms, 0,031 ms pro Verbindung
112 ms, 0,112 ms pro Verbindung
450 ms, 0,45 ms pro Verbindung
Wir verwenden diese Methode recht häufig (Wartungsfreundlichkeit), und bei Leistungsvergleichen zeigt sich, dass dies die Leistung der Website stark beeinträchtigt - Seiten enthalten schnell 30 oder mehr solcher Links, was 10 ms zusätzlichen Overhead auf einer einzigen Seite bedeutet. Selbst 0,112ms pro URL sind etwa 4ms reiner CPU-Overhead.
Es ist anzumerken, dass die Leistung aller drei URL-Generierungsaufrufe zwischen MVC Preview 3 und Beta (gestern veröffentlicht) um den Faktor 5 verbessert wurde.
Stack Overflow wird angeblich von demselben Framework betrieben, wie habt ihr dieses Skalierungsproblem gelöst? Liberale Zwischenspeicherung der Titelseite (viele Links) und vorgerenderte Steuerelemente?
Gibt es andere Produktionswebsites in ASP.NET MVC mit Leistungsproblemen oder gute Tipps?