2016-10-13 11 views
5

में प्रदर्शन के लिए मेरे वर्तमान एप्लिकेशन में मैं उपयोगकर्ता को प्रदर्शित करने के लिए काफी लंबी तालिका उत्पन्न कर रहा हूं। मुझे इसके साथ कुछ गंभीर प्रदर्शन समस्याएं दिखाई दे रही हैं, जिन्हें मैंने @ HTML.DisplayFor के उपयोग के लिए ट्रैक किया है, और मुझे पूरा यकीन नहीं है कि क्यों।धीमी प्रदर्शन ASP.NET कोर एमवीसी

संपादित करें: मैंने कोड नमूना को अधिक संक्षिप्त और पुनरुत्पादित सेटअप के साथ बदल दिया है।

इस मुद्दे को अलग करने के लिए, मैंने दृश्य स्टूडियो में सभी डिफ़ॉल्ट सेटिंग्स का उपयोग करके एक नया एएसपीनेट कोर एमवीसी प्रोजेक्ट बनाया है, बिना प्रमाणीकरण के।

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) 
} 

इस कोड को चलाने पर, इसे चलाने के लिए एक सेकंड से अधिक समय लगता है! अपराधी डिस्प्लेफायर है। यदि मैं दृश्य को निम्नानुसार बदलता हूं:

@model List<DisplayForTest.ViewModels.TestingViewModel> 

@foreach (var item in Model) 
{ 
    @item.Id 
    @item.TextValue1 
    @item.TextValue2 
} 

यह 13ms में प्रस्तुत करता है। यह स्पष्ट है कि डिस्प्लेफ़ोर प्रतिपादन के लिए बहुत अधिक समय जोड़ रहा है ... मेरे पीसी पर प्रति कॉल लगभग 0.4ms है। हालांकि यह अलगाव में बुरा नहीं है, यह सूचियों या अन्य चीजों के लिए यह एक बहुत खराब विकल्प बनाता है।

DisplayFor वास्तव में बस इतना धीमा है? या क्या मैं इसे गलत तरीके से उपयोग कर रहा हूं?

+2

'DisplayFor' आपके ऑब्जेक्ट में प्रत्येक प्रॉपर्टी तक पहुंचने के लिए प्रतिबिंब का उपयोग करता है, यह एक ईएफ आलसी लोड को ट्रिगर कर सकता है यदि यह नेविगेशन प्रॉपर्टी है। यह हो रहा है कि क्या हो रहा है। – Dai

+0

एक और कारण है कि आपको अपने विचारों में दृढ़ता मॉडल का उपयोग क्यों नहीं करना चाहिए, इसके बजाय दृश्य मॉडल का उपयोग करें। हालांकि हम नहीं जानते कि ओपी क्या उपयोग करता है, ईएफसीओआर में आलसी नहीं है लोडिंग अभी तक कार्यान्वित किया गया है, केवल EF6 – Tseng

+0

मैं इसके लिए EFCore का उपयोग कर रहा हूं।मैंने इसे तुरंत एक दृश्य मॉडल में परिवर्तित कर दिया, और 'सदस्यों' के साथ डेटा का चयन किया। चयन करें (एस => नए सदस्य लिस्ट व्यूमोडेल {आईडी = एसआईआईडी})। ToList(); ', लेकिन ऐसा लगता है कि समान प्रदर्शन समस्याएं हैं। – Doddler

उत्तर

2

प्रदर्शन वास्तव में धीमा है? या क्या मैं इसे गलत तरीके से उपयोग कर रहा हूं?

लैम्बडा अभिव्यक्तियों का मूल्यांकन और निष्पादन करने में थोड़ा अधिक ओवरहेड लगता है। पहले ढांचे को validate it, फिर evaluate it होना चाहिए। मैं यहां थोड़ा सा अनुमान लगा रहा हूं, लेकिन ऐसा लगता है कि प्रदर्शन की चिंताएं आ रही हैं; इन दोनों तरीकों में प्रतिबिंब की आवश्यकता है।

मेरे द्वारा खेले गए अन्य सभी प्रदर्शन विधियों (ValueFor, DisplayTextFor, आदि) आपके उदाहरण में समान प्रदर्शन प्रभाव डालते हैं।

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

इस मामले में, मैं नहीं एक समस्या सिर्फ कच्चे मूल्य (मूल रूप से .ToString यह ing) का उपयोग कर, या आप जो खोज रहे हैं पर निर्भर करता है एक Html.Encode/Html.Raw विधि के भीतर इसे उपयोग करने के साथ दिख रहा है।

+0

क्या यह निष्कर्ष निकालना उचित है कि उन प्रकारों के लिए जिन्हें कस्टम डिस्प्ले टेम्पलेट्स की आवश्यकता नहीं है, 'डिस्प्लेफ़ोर' ओवरकिल है? यह मुझे स्पष्ट है कि अगर मैं इस पृष्ठ पर कई रिकॉर्ड दिखाना चाहता हूं तो मैं उस पर भरोसा नहीं कर सकता। 10 कॉलम के साथ, प्रत्येक पंक्ति जो मैं प्रस्तुत करता हूं वह 'डिस्प्लेफ़ोर' का उपयोग कर सर्वर को 4-5ms ले जाएगा, जो वास्तव में स्वीकार्य नहीं है। मैंने 'ValueFor' को एक प्रयास दिया था, और जब यह थोड़ा तेज़ था, तब भी यह वास्तव में धीमा था। इसका मुख्य कारण यह है कि मैं इसका उपयोग कर रहा हूं क्योंकि मचान आपको स्वचालित रूप से इसके साथ सेट करता है। यदि यह व्यवहार की अपेक्षा की जाती है, तो मैं इसे उत्तर के रूप में स्वीकार कर सकता हूं। – Doddler

+0

@ डोडलर आप 'ValueFor' प्रदर्शन के बारे में सही हैं - मेरा जवाब चिह्न से थोड़ी दूर था। मैंने प्रश्न का बेहतर समाधान करने के लिए अपना जवाब अपडेट कर लिया है। –

+2

आपकी मदद के लिए धन्यवाद! थोड़ी देर के लिए इसके साथ गड़बड़ करने के बाद, मैं नियमित रूप से सीधे उत्पादन करने की दिशा में झुका रहा हूं, और अधिक जटिल प्रकार प्रदर्शित करने के लिए टैगहेल्पर या एचटीएमएलहेल्पर का उपयोग कर रहा हूं। मुझे टैग सहायक के लिए कुछ लागत लगने की उम्मीद है लेकिन वे वास्तव में कुशल लगते हैं। – Doddler