2013-03-23 5 views
18

मैंने हाल ही में 5.0 का उपयोग करके एक डीबीकॉन्टेक्स्ट में 4.1 का उपयोग करके ऑब्जेक्ट कॉन्टेक्स्ट से ऑब्जेक्ट कॉन्टेक्स्ट से अपना इकाई मॉडल ले जाया। मुझे ऐसा करने में खेद हो रहा है क्योंकि मैं DbContext बनाम ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग कर क्वेरी पर कुछ बहुत खराब प्रदर्शन देख रहा हूं। यहां परीक्षण परिदृश्य है:डीबीकॉन्टेक्स्ट क्वेरी प्रदर्शन खराब बनाम ऑब्जेक्ट कॉन्टेक्स्ट

दोनों संदर्भ समान डेटाबेस का उपयोग लगभग 600 तालिकाओं के साथ करते हैं। LazyLoading और ProxyCreation दोनों के लिए बंद है (कोड उदाहरण में दिखाया नहीं गया है)। दोनों में पूर्व-उत्पन्न विचार हैं।

परीक्षण पहले मेटाडेटा वर्कस्पेस को लोड करने के लिए 1 कॉल बनाता है। फिर एक लूप में जो 100 बार निष्पादित हो जाता है, मैं एक संदर्भ को नया करता हूं और पहला कॉल करता हूं जो पहले 10 लेता है। (मैं लूप के अंदर संदर्भ बना रहा हूं क्योंकि यह डब्लूसीएफ सेवा में इस्तेमाल किया जा रहा है, जो बनाता है संदर्भ हर बार)

for (int i = 0; i < 100; i++) 
{ 
    using (MyEntities db = new MyEntities()) 
    { 
     var a = db.MyObject.Take(10).ToList(); 
    } 
} 

जब मैं ऑब्जेक्ट कॉन्टेक्स्ट के साथ इसे चलाता हूं तो इसमें लगभग 4.5 सेकंड लगते हैं। जब मैं इसे डीबीकॉन्टेक्स्ट का उपयोग करके चलाता हूं तो इसमें लगभग 17 सेकंड लगते हैं। मैंने RedGate के प्रदर्शन प्रोफाइलर का उपयोग करके इसका प्रोफाइल किया। डीबीकॉन्टेक्स्ट के लिए ऐसा लगता है कि प्रमुख अपराधी UpdateEntitySetMappings नामक एक विधि है। इसे प्रत्येक क्वेरी पर कहा जाता है और ओएसपेस में प्रत्येक आइटम के माध्यम से मेटाडेटार्कस्पेस और चक्र को पुनर्प्राप्त करने लगता है। AsNoTracking मदद नहीं की थी।

संपादित करें: कुछ बेहतर विवरण देने के लिए, समस्या को एक ऑब्जेक्टसेट बनाम डीबीसेट के निर्माण \ प्रारंभिकरण के साथ करना है, वास्तविक क्वेरी नहीं। जब मैं ऑब्जेक्ट कॉन्टेक्स्ट के साथ कॉल करता हूं, ऑब्जेक्टसेट बनाने के लिए औसत 42ms लगते हैं। जब मैं डीबीकॉन्टेक्स्ट के साथ कॉल करता हूं, तो आंतरिक dbset बनाने में लगभग 140ms लगते हैं। ऑब्जेक्टसेट और डीबीसेट दोनों मेटाडेटावाक्स्पेस से कुछ एंसेटसेट मैपिंग लुकअप करते हैं। मैंने जो देखा है वह यह है कि ऑब्जेक्टसेट नहीं करता है, जबकि डीबीसेट यह कार्यक्षेत्र में सभी प्रकार के लिए करता है। मैं अनुमान लगा रहा हूं (कोशिश नहीं की है) कि कम तालिका वाले मॉडल जो प्रदर्शन अंतर कम है।

उत्तर

2

डीबीकॉन्टेक्स्ट ऑब्जेक्ट कॉन्टेक्स्ट के लिए एक रैपर है। यहां आपके प्रश्न के बारे में अच्छा answer है। यह संभव है कि उपयोग करने में आसान बनाने के लिए उन्होंने बलिदान प्रदर्शन किया।

-3

मैं लाखों रिकॉर्ड पूछने के लिए Simple.Data का उपयोग करता हूं और यह काफी अच्छा और तेज़ काम करता है।

4

मैं भी कर दिया गया कोड पहले दृष्टिकोण के खराब प्रदर्शन से चिंतित है और मैं, एक परिदृश्य में कुछ मानक तुम्हारा

http://netpl.blogspot.com/2013/05/yet-another-orm-micro-benchmark-part-23_15.html

के समान परिणाम कोई आश्चर्य की बात कर रहे थे प्रदर्शन किया गया है के बाद से DbContext है ऑब्जेक्ट कॉन्टेक्स्ट पर एक रैपर, इसे सादगी के लिए प्रदर्शन बलिदान देना है। लेकिन, मेरा परीक्षण पता चलता है कि:

  • अधिक रिकॉर्ड आप कम पुनः प्राप्त
  • अधिक रिकॉर्ड अंतर है आप और अधिक महत्वपूर्ण यह है पर नज़र रखने के बंद करने के लिए करता है, तो आप तेजी से होना चाहता हूँ पुनः प्राप्त

उदाहरण के लिए, सिर्फ 10 रिकॉर्ड

enter image description here

ध्यान दें कि कोड पहले की तुलना में काफी धीमी है पुन: प्राप्त करने मॉडल पहले और ट्रैकिंग और ट्रैकिंग के बीच कोई उल्लेखनीय अंतर नहीं है - दोनों अवलोकन बिल्कुल आपके जैसा हैं।

लेकिन जब 10000 पंक्तियों को पुन: प्राप्त आपके पास

enter image description here

नोट notracking संस्करण में पहले कोड के पहले और मॉडल के बीच लगभग कोई अंतर नहीं है। इसके अलावा, दोनों आश्चर्यजनक रूप से अच्छी तरह से प्रदर्शन करते हैं, लगभग कच्चे ado.net datareader के रूप में तेजी से।

अधिक जानकारी के लिए कृपया मेरे ब्लॉग एंट्री का पालन करें।

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

(ए ओर ध्यान दें: मेरी बेंचमार्क यह भी खुलासा कुछ nHibernate के साथ गलत मैं अभी भी नहीं मिला है किसी को भी मुझे यह समझाने के लिए भले ही मैं दो स्वतंत्र डेवलपर्स जो राष्ट्रीय राजमार्ग दैनिक उपयोग करने से चर्चा की है मदद करने के लिए नहीं है।)

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