2012-06-22 17 views
11

मुझे आश्चर्य है कि पहले ईएफ कोड के साथ पहली क्वेरी को तेज करना संभव है या नहीं।इकाई फ्रेमवर्क स्टार्टअप समय

मैंने 2 फ़ील्ड वाले एक इकाई के साथ एक छोटा परीक्षण कार्यक्रम बनाया है, और पहली क्वेरी में 2.2 सेकंड लगते हैं, दूसरी क्वेरी (जो सटीक है) 0.006 सेकेंड लेती है।

मैं पहले से ही दृश्य को पूर्ववत कर रहा हूं, ताकि यहां सहायता न हो। मुझे लगता है कि समस्या यह है कि स्मृति में मॉडल को बनाने में कुछ समय लगता है, लेकिन क्या इसे लंबे समय तक लेना चाहिए? और क्या इस मॉडल को प्रीकंपाइल करने का कोई तरीका है जैसे विचारों के साथ?

+1

ऐसा नहीं लगता कि यह संभव है, लेकिन मैं गलत हो सकता हूं। पहली प्रश्न के दौरान क्या हो रहा है यह समझने के लिए इस प्रश्न को देखें http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time –

+0

@ राफेल अलाथॉस आप सही हो सकते हैं:/यह सिर्फ अजीब है .. आप DbModelBuilder क्लास का उपयोग करके और फिर उस ऑब्जेक्ट पर बिल्ड विधि को कॉल करके अपना खुद का मॉडल बना सकते हैं, इसलिए इसे रनटाइम के बजाय संकलन समय पर करना संभव है .. लेकिन शायद यह अभी लागू नहीं हुआ है। – nyhjem

+0

डेटाबेस स्कीमा संगतता की जांच करने में कुछ समय लग सकता है। आप एसक्यूएल प्रोफाइलर का उपयोग करके इसे देख सकते हैं। –

उत्तर

5

यह आलेख: Squash Entity Framework startup time with pre-compiled views विस्तार से एक समाधान का वर्णन करता है।

यह अनुकूलन इकाई डेटा मॉडल इकाई की रूपरेखा विद्युत उपकरण में विकल्प का उपयोग कर एक पूर्व संकलित .Views वर्ग फ़ाइल उत्पन्न करने के लिए शामिल है।

+4

मैंने पहले से ही कोशिश की है, लेकिन अब मैंने आपके द्वारा लिंक किए गए आलेख में दिए गए चरणों का पालन किया है। दृश्य उत्पन्न हो रहा है, लेकिन वह पहली पहुंच अभी भी धीमी है। मैंने थोड़ा परीक्षण किया है। सबसे पहले मैं एक ordenary SqlConnection और SqlCommand के साथ डेटाबेस का उपयोग करता हूं। यह 0.2 सेकंड लेता है। उसके बाद मैं ईएफ का उपयोग करता हूं और कुछ ऐसा करता हूं (con.Users.Count();)। यह 3.08 सेकेंड लेता है ..! फिर मैं कोड की सटीक उसी पंक्ति को फिर से चलाता हूं, और अब से केवल 0.007 सेकेंड लेता है .. तो स्पष्ट रूप से ईएफ पहली बार डेटाबेस तक पहुंचने पर विचार उत्पन्न करने के अलावा कुछ और कर रहा है .. – nyhjem

4

जब आप अपनी पहली क्वेरी करते हैं, तो ईएफ स्वयं को प्रारंभ करता है और इसमें कुछ समय लगता है। मुझे नहीं लगता कि ईएफ के बुनियादी ढांचे की शुरुआत में तेजी लाने के लिए बहुत कुछ करना है, लेकिन यदि आप वास्तव में जो देख रहे हैं, वह है कि आप पहले की क्वेरी को तेज करें और ईएफ की शुरुआत नहीं, तो आप प्रारंभ करने के लिए ईएफ को मजबूर करने का प्रयास कर सकते हैं से पहले अपनी पहली क्वेरी चला रहा है।

 using (var db = new MyContext()) 
     { 
      db.Database.Initialize(force: true); 
     } 
+3

बल = सत्य होगा, ठीक है, फिर भी पुनर्नवीनीकरण को बल दें, भले ही पहले से ही इसके इन्फ्रा स्ट्रक्चर/इंटर्नल्स को पहले से शुरू किया गया हो, इसलिए बल का उपयोग न करें: सत्य जब तक आप कनेक्शन स्ट्रिंग या टेबल स्ट्रक्चर बदल नहीं लेते। –

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