ASP.NET MVC の小さなベンチマーク。ビューページ コード:
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/>";
}
コードを表示:
<%= 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")) ) %>
ASP.NET MVC Beta を使用して、既定の新しいプロジェクト テンプレートの一般的な Core2 ノートブックでこれを実行すると、次の結果が得られます。
38 ミリ秒、リンクあたり 0,038 ミリ秒
120 ミリ秒、リンクあたり 0.12 ミリ秒
54 ミリ秒、リンクあたり 0.054 ミリ秒
全部で約 100 のメソッドと 30 のルーティング テーブル エントリを持つ約 10 のコントローラーを使用して実稼働プロジェクトで同じベンチマークを実行すると、式ベースのメソッドのパフォーマンスが大幅に低下します。
31 ミリ秒、リンクあたり 0.031 ミリ秒
112 ミリ秒、リンクあたり 0.112 ミリ秒
450 ミリ秒、リンクあたり 0.45 ミリ秒
私たちはこの方法をかなり頻繁に使用し (保守性)、いくつかのパフォーマンス ベンチマークを行っています。これにより、サイトのパフォーマンスが大幅に低下します。ページには、そのようなリンクがすぐに約 30 以上含まれます。つまり、1 つのページで 10 ミリ秒の追加のオーバーヘッドが発生します。URL ごとに 0.112 ミリ秒であっても、純粋な CPU オーバーヘッドは約 4 ミリ秒です。
MVC Preview 3 と Beta (昨日リリース) の間の 3 つの URL 生成呼び出しすべてのパフォーマンスが 5 倍改善されたことに注意してください。
スタック オーバーフローは同じフレームワークを使用していると思われますが、皆さんはこのスケーリングの問題にどのように取り組んでいますか? フロントページ (たくさんのリンク) と事前にレンダリングされたコントロールのリベラルなキャッシュ?
ASP.NET MVC の他の実稼働 Web サイトで、パフォーマンスの問題やヒントがあるものはありますか?