4

ネストされた Html.RenderPartials で構築された asp.net ビュー/ページ (動的) があります。ビューには、レンダリングする適切なビューモデルが送信されます。

Firebug によると、HTML の GET 応答は 9.5KB に対して 9.89 秒です。同じサイトのFAQページ(静的html)を比較すると、17Kで1.3秒。

最初は、ビューモデルの複雑さが原因で SQL エンティティのバックエンドが遅くなったのだと思っていましたが、ログによると、ビューモデルを 1 秒未満で構築しているようです。

MVC ビューのレンダリングに時間がかかる理由と、これを高速化する方法を教えてください。ajaxによる部分読み込みを検討しています。

(ちなみに、GzipしてCDNなどを使用しています-サイト全体を遅くしました)

編集:

OnActionExecuting/OnActionExecuted および OnResultExecuting/OnResultExecuted にタイマー (ストップウォッチ) を追加しました。

09/12/2010 18:39:20: コントローラー: プロファイル アクション: インデックス 経過時間: 680.6431 - アクション

09/12/2010 18:39:29: コントローラー: プロファイル アクション: インデックス 経過時間: 9202.063 - 結果

フレームワークがビューをレンダリングするのに 9 秒。

4

1 に答える 1

2

問題が解決しました

まず、あなたの提案に感謝します。問題が見つかるまで、各提案に何度も従いました。これが間違っていたことであり、誰かが他の人のために明確にすることができるかもしれません.

VS2010 Performance Wizard は、PartialViews に渡される各オブジェクトが膨大な CPU 時間を占有していると言っており、問題がある可能性があることを読んだので、それは部分的なものであると推測しました。

foreach (ProfileComment item in Model)
{
    Html.RenderPartial("UserActivityComment", item);
}
...
Friends friend = Model.Friends.Where(e => e.ID == activity.ActionID).FirstOrDefault();
if (friend.FriendsProfile.UserName != Page.User.Identity.Name)
{
    Html.RenderPartial("UserActivityFriend.ascx", friend);
}

ProfileComment オブジェクトと Friends オブジェクト (およびその他) は、私が生成してページに渡す ViewModel の一部です。これで、VM は Entity Framework を介して 0.3 秒未満で生成されるので、VM ですべてがうまくいったと推測しました。

ビューでそれを処理したかったときに、大きな遅延が発生しました。「for ループ」内のモデルにフラグが立てられ、パフォーマンス ウィザードによって FirstOrDefault にもフラグが立てられました。

うーん、奇妙なことに、モデルは迅速に構築されますが、迅速に処理されません。解決:

_entities.Friends.MergeOption = MergeOption.NoTracking;
_entities.ProfileComment.MergeOption = MergeOption.NoTracking;

問題は、VM からオブジェクトを抽出してパーシャルに送信することだったと思います。関係のエンティティ管理も維持したかったからです。

詳細については、アイア リサーチをご覧ください。

および blogs.microsoft.co.il/blogs/gilf/archive/2009/02/20/disabling-change-tracking-in-entity-framework.aspx

これをさらに詳細に展開してください。ところで、パフォーマンスの向上は非常に大きかったです。

于 2010-09-14T15:29:37.567 に答える