2009-04-03 8 views
8

प्रश्न: मैं एमवीसी पेज प्रस्तुत करने के लिए कुल समय की गणना कैसे करूं और मास्टर पेज पर समय प्रदर्शित करूं।पृष्ठ एमवीसी में रेंडर समय

Asp.net वेब फ़ॉर्म में मैं बनाया था, इसलिए की तरह एक बेस पेज वर्ग:

public class PageBase : System.Web.UI.Page 
{  
    private DateTime startTime = DateTime.Now; 
    private TimeSpan renderTime; 
    public DateTime StartTime 
    { 
     set { startTime = value; } 
     get { return startTime; } 
    } 
    public virtual string PageRenderTime 
    { 
     get 
     { 
      renderTime = DateTime.Now - startTime; 
      return renderTime.Seconds + "." + renderTime.Milliseconds + " seconds"; 
     } 
    }  
} 

मैं तो इतना की तरह मेरे मास्टर पृष्ठ पर विधि कहेंगे:

<div id="performance"> 
    <% =PageRenderTime %> 
</div> 

प्रश्न: मैं किस मैं एमवीसी फ्रेमवर्क के साथ एक ही चीज़ को पूरा करता हूं?

प्रश्न: एमवीसी ढांचे के साथ मैं एक पृष्ठ पहली बार कब बनाया गया है जब मैं प्रारंभ समय निर्धारित करता हूं?

+1

नहीं अपने प्रश्न का उत्तर लेकिन System.Diagnostics.Stopwatch पर एक नज़र डालें जब आप इस तरह के अंतराल की गणना करना चाहते हैं। Http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance –

उत्तर

1

आधार नियंत्रक बनाएं और अपने नियंत्रक इसे प्राप्त करें। अपने प्रारंभ समय को कन्स्ट्रक्टर में सेट करें और ओवरराइड() को ओवरराइड करें और कुल समय की गणना करें। यह आपको कार्रवाई के पूरे जीवन पर अंत तक समाप्त करना चाहिए। चूंकि नियंत्रक आईडीस्पोज़ेबल लागू करता है, इसलिए मुझे लगता है कि परिणाम प्रस्तुत होने के बाद रेंडर इंजन इसका निपटान करेगा और आपको कचरा संग्रहण की प्रतीक्षा नहीं करनी पड़ेगी। अगर मेरी धारणा गलत साबित होती है, तो आप इसके बजाय OnResultExecuted() का उपयोग कर सकते हैं।

EDIT: पृष्ठ पर प्रतिपादन समय प्राप्त करने के लिए अपेक्षाकृत कठिन होगा क्योंकि परिभाषा के अनुसार पृष्ठ को पृष्ठ पर आपके समय तक रखे जाने तक प्रतिपादन नहीं किया जा सकता है और आपके पास पृष्ठ तक समय नहीं हो सकता प्रतिपादन किया जाता है। हालांकि, आप सत्र में रेंडर टाइम लिख सकते हैं, फिर AJAX का उपयोग वापस आने के लिए करें और बाद में प्रदर्शन के लिए रेंडर टाइम प्राप्त करें। आप व्यूडेटा में प्रारंभ समय डालकर और दृश्य में प्रतिपादन समय की गणना करके इसे अनुमानित करने में सक्षम हो सकते हैं। आप रेंडर समय लॉगिंग करने और दृश्य अनुमान को करने का प्रयास करना चाहेंगे और देखें कि यह कितना करीब है।

यह कोड रेंडर समय लॉग करने के लिए उपयोग किया जा सकता है।

public class BaseController : Controller 
{ 
    private DateTime StartTime { get; set; } 
    public BaseController() : base() 
    { 
     StartTime = DateTime.Now; 
    } 

    public override void Dispose(bool disposing) 
    { 
     var totalTime = DateTime.Now - this.StartTime; 
     ... write it out somewhere ... 
    } 
} 
2

मैं शायद नियंत्रक वर्ग पर OnActionExecuting और OnActionExecuted तरीकों को ओवरराइड करेगी।

public class BaseController : Controller { 
    // Called before the action is executed 
    public override void OnActionExecuting(ActionExecutingContext ctx) { 
     base.OnActionExecuting(ctx); 
     // Start timing 
    } 

    // Called after the action is executed 
    public override void OnActionExecuted(ActionExecutedContext ctx) { 
     base.OnActionExecuted(ctx); 
     // Stop timing 
    } 
} 
+0

मुझे लगता है कि यह आपको केवल परिणाम डेटा सेट करने का समय देगा , वास्तव में पृष्ठ प्रस्तुत नहीं करते हैं। समय प्रस्तुत करने के लिए, OnResultExecuted, जिसे ActionResult निष्पादित करने के बाद बुलाया गया है, अधिक सटीक है। – tvanfosson

+0

सच है, लेकिन मुझे नहीं लगता कि परिणाम निष्पादित होने के बाद आप व्यूडेटा को संशोधित कर सकते हैं, जिसका अर्थ है कि पृष्ठ पर निष्पादन समय प्रदर्शित करने का कोई तरीका नहीं है। अगर मैं गलत हूं, तो मुझे सही करें। –

+3

हां। यह भी मेरी समझ होगी। लेकिन यदि आप सटीक उपाय प्राप्त करने की आवश्यकता रखते हैं तो आप समय को स्टोर कर सकते हैं और इसे AJAX के माध्यम से पुनर्प्राप्त कर सकते हैं। व्यक्तिगत रूप से मैं इसे लॉग ऑन करता हूं और पेज पर इसे प्राप्त करने की चिंता नहीं करता हूं। – tvanfosson

4

अपने web.config में जाकर सुनिश्चित करें कि आपके ...

<system.web> 
    <trace enabled="true" localOnly="false" /> 
</system.web> 

तो आप कर सकते हैं गोटो http://.../trace.axd और किए गए प्रत्येक अनुरोध को देखते हैं।

फिर आप पहले से (कॉलम) कॉलम के नीचे देखना चाहते हैं और आखिरी बार पृष्ठ (सर्वर पक्ष) प्रस्तुत करने के लिए लिया गया समय है।

उदाहरण ...

aspx.page End Render 0.06121112 0.005297 

61,2 एमएस पेज रेंडर करने के लिए।

यदि आप समय कोड स्वयं देख रहे हैं या आप मैन्युअल रूप से कुछ डायग्नोस्टिक्स करना चाहते हैं तो आप सिस्टम का उपयोग करना चाहते हैं। डायग्नोस्टिक्स। स्टॉपवॉच क्लास डेटटाइम नहीं।

Stopwatch sw = Stopwatch.StartNew(); 
... 
sw.Stop(); 
Trace.Write(sw.ElapsedMilliseconds); 
+0

धन्यवाद ... मैं वास्तव में पृष्ठ को मास्टर पेज के पाद लेख पर प्रस्तुत करना चाहता हूं। – TonyAbell

+0

आप ट्रेस ऑब्जेक्ट का उपयोग कर सकते हैं और ट्रेस आउटपुट को लिखने के लिए Trace.Write() कर सकते हैं और यह इसे ईवेंट की सूची में जोड़ देगा और समय प्रस्तुत करेगा आदि। –

+0

वह प्रस्तुत करने में लगने वाले समय के लिए पूछ रहा है (ग्राहक द्वारा आवश्यकता ?), जो आप सुझाव देते हैं वह सभी प्रकार की डीबग जानकारी प्रदर्शित कर रहा है जिसे वह देखना नहीं चाहता है। – GvS

संबंधित मुद्दे