私の現在のアプリケーションでは、かなり長いテーブルを生成してユーザーに表示しています。私は、@ Html.DisplayForの使い方まで追跡した重大なパフォーマンス上の問題を見てきましたが、なぜそれほど確かではありません。ASP.NETでパフォーマンスが遅いDisplayFor ASP.NET MVC
編集:コードサンプルをより簡潔で再現性のある設定に置き換えました。
問題を特定するために、私はVisual Studioのすべてのデフォルト設定を使用して、認証なしで新しいasp.netコアMVCプロジェクトを作成しました。私は、次のようなビューモデルを作成した:ビューは、データを表示することができる最低限である
public IActionResult TestThings()
{
var list = new List<TestingViewModel>();
for(var i = 0; i < 1000; i++)
list.Add(new TestingViewModel {Id = i, TextValue1 = "Test", TextValue2 = "Test2"});
return View(list);
}
:そして
public class TestingViewModel
{
public int Id { get; set; }
public string TextValue1 { get; set; }
public string TextValue2 { get; set; }
}
ビューに渡すデータとビューモデルを満たすコントローラを追加しました:
@model List<DisplayForTest.ViewModels.TestingViewModel>
@foreach (var item in Model)
{
@Html.DisplayFor(m => item.Id)
@Html.DisplayFor(m => item.TextValue1)
@Html.DisplayFor(m => item.TextValue2)
}
このコードを実行すると、実行に1秒以上かかる!原因はDisplayForです。
@model List<DisplayForTest.ViewModels.TestingViewModel>
@foreach (var item in Model)
{
@item.Id
@item.TextValue1
@item.TextValue2
}
これは13msでレンダリングされます。 DisplayForがレンダリングに膨大な時間を追加していることは間違いありません。私のPC上では1コールあたり0.4ms近くあります。それは孤立しているわけではありませんが、リストやその他のものにとっては非常に悪い選択です。
DisplayFor
は本当に遅いですか?または私はそれを間違って使用していますか?
'DisplayFor'は、オブジェクトのすべてのプロパティにアクセスするためにリフレクションを使用します。これは、ナビゲーションプロパティの場合、EF遅延ロードを引き起こす可能性があります。これは起こっている可能性があります。 – Dai
ビューでパーシスタンス・モデルを使用しない理由は、ビュー・モデルを代わりに使用する理由です。 OPが何を使用しているのか分かりませんが、EFCoreには遅延ロードが実装されていません。EF6のみ – Tseng
私はこれにEFCoreを使用しています。私はすばやくビューモデルに変換し、 'Members.Select(s => new MembersListViewModel {Id = s.Id}).ToList();'でデータを選択しましたが、パフォーマンス上の問題は同じようです。 – Doddler