FindPartialView() で奇妙なパフォーマンスの問題が発生しています。デバッグするために、リリース モードで実行する次のコードがあります。
var startTime = DateTime.Now;
var view = this.BaseViewEngine.FindPartialView(context, proposedViewPath, useCache);
var timeTaken = DateTime.Now - startTime;
this.log.Write(string.Format("FindPartialView Result: useCache='{0}' proposedViewPath='{1}' TimeTakenMS={2}ms", useCache, proposedViewPath, timeTaken.TotalMilliseconds));
BaseViewEngine は、Application_Start で作成された WebFormViewEngine のインスタンスです。
キャッシュにない場合、次のようなログが生成されます
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/TopNavigation.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='False' proposedViewPath='~/Controls/Navigation/TopNavigation.ascx' TimeTakenMs=1607ms
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/FooterMenu.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='False' proposedViewPath='~/Controls/Navigation/FooterMenu.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/FooterMenuItem.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='False' proposedViewPath='~/Controls/Navigation/FooterMenuItem.ascx' TimeTakenMs=1279ms
そして、次の場合:
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/TopNavigation.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/FooterMenu.ascx' TimeTakenMs=0ms
FindPartialView Result: useCache='True' proposedViewPath='~/Controls/Navigation/FooterMenuItem.ascx' TimeTakenMs=0ms
これはそれほど悪くはありませんが、私たちが抱えている問題は、アイテムがキャッシュからランダムかつ頻繁に削除されるように見えることです (77 個のログ エントリのうち 17 個がわずか数分間隔で発生します)。キャッシュ内で見つからないため、useCache=false で実行されますが、これには途方もない時間がかかります (4 秒以上かかったことが記録されています)。
まず、なぜそんなに時間がかかるのか誰か知っていますか? これはデバッグ モードでコンパイルされておらず、絶対パスを指定しているため、検索する必要はありません。代わりに完全なファイルシステム パス (例: C:\Web\Controls\Navigation\FooterItem.ascx) を指定しようとしましたが、まったく機能しませんでした。
次に、少なくともアイテムがキャッシュされたままになるように、カスタム ビュー キャッシュを使用する方法はありますか?
ありがとう!
編集:これまでのところ、私はこれを手に入れており、私たちの使用パターンでうまくいくようです。誰もこれをしない正当な理由を考えられますか?
/// <summary>
/// Optimised WebFormViewEngine to fix performance issue with FindView / FindPartialView
/// </summary>
public class FastWebFormViewEngine : WebFormViewEngine
{
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
// If absolute path then no need to search for the view
return partialViewName.StartsWith("~")
? new ViewEngineResult(this.CreatePartialView(controllerContext, partialViewName), this)
: base.FindPartialView(controllerContext, partialViewName, useCache);
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
// If absolute path then no need to search for the view
return viewName.StartsWith("~") && (string.IsNullOrEmpty(masterName) || masterName.StartsWith("~"))
? new ViewEngineResult(this.CreateView(controllerContext, viewName, masterName), this)
: base.FindView(controllerContext, viewName, masterName, useCache);
}
}