2010-04-06 5 views
5

मैं खाता लोड करने और इसे क्लाइंट में स्थानांतरित करने के लिए MySQL कनेक्टर .NET का उपयोग कर रहा हूं। खाते के बच्चे तत्वों को लोड करने पर विचार करते हुए यह ऑपरेशन बल्कि गहन है।क्या डीबग और रिलीज के बीच कोई (प्रदर्शन) अंतर है?

डीबग मोड में, खाते को लोड करने के लिए सबसे अधिक, 1 सेकंड लगता है। औसत 500 मिमी होगा। रिलीज मोड में, खाते को लोड करने में 1 से 4 सेकंड लगते हैं। औसत 1500ms होगा।

चूंकि कोई #if DEBUG निर्देश या मेरे कोड की तरह नहीं है, तो मुझे आश्चर्य है कि अंतर कहां से आ रहा है।

क्या कोई प्रोजेक्ट बिल्ड विकल्प बदल सकता है? या क्या इसे MySQL कनेक्टर .NET के साथ करना है जिसमें बिल्ड मोड के आधार पर अलग-अलग व्यवहार होंगे?

संपादित करें: निगरानी की टिकटें।

Debug (Average: 213000 ticks) 
730000 
320000 
60000 
50000 
190000 
130000 
210000 
180000 
160000 
110000 
390000 
270000 
150000 
190000 
230000 
210000 
150000 
200000 
190000 
140000 

Release (Average: 4404500 ticks) 
12940000 
170000 
180000 
80000 
80000 
130000 
120000 
5060000 
5090000 
130000 
50000 
10430000 
25160000 
150000 
160000 
130000 
17620000 
10160000 
100000 
150000 

तुलना:

रिलीज 20x लेता है समय डीबग लेता है (औसत तुलना)।

4.404.500/213.000 = 20

अब पहला ऑपरेशन वास्तव में लंबे समय तक है, लेकिन सामान्य रूप में, तो जारी करने के लिए अन्य सभी बार कर रहे हैं। कोई विचार?

EDIT 2: मैंने एक व्यापक परीक्षण भी जोड़ा जो कुल समय की गणना करता है। 50 खाता भारों के लिए, डीबग में औसत 4 सेकंड और रिलीज में 40 सेकंड लगते हैं। मैं इस पर काफी हताश हो रहा हूं - यह मेरे आवेदन के लिए एक गंभीर प्रदर्शन मुद्दा है। क्या किसी को यह तय करने का अनुमान है कि इसे कैसे ठीक किया जाए?

+0

आप खाता लोड करने में लगने वाले समय को कैप्चर कर रहे हैं? क्या आप लूप के भीतर कई बार ऑपरेशन कर रहे हैं और औसत ले रहे हैं? या आप हर बार एक नई प्रक्रिया के रूप में आवेदन लॉन्च कर रहे हैं? –

+0

एक अंतर है, सिवाय इसके कि यह आम तौर पर अन्य तरीका है क्योंकि डीबग मोड iirc में कोड ऑप्टिमाइज़ेशन नहीं होता है। मैं निश्चित रूप से कुछ कह सकता हूं, कि mysql .net कनेक्टर ने कभी भी ऐसी किसी भी परियोजना में अपने लिए ऐसा व्यवहार नहीं किया है जिस पर मैंने काम किया है। –

+4

एक प्रोफाइलर का प्रयोग करें। कुछ और अनुमान लगा रहा है। –

उत्तर

1

मैंने इसे समझ लिया, मैंने अपनी निर्भरता निर्माण में से किसी एक में असुरक्षित कोड की अनुमति दी। मैं अभी भी सोच रहा हूं कि यह ऐसा क्यों व्यवहार कर रहा है, लेकिन मुझे इसे और अधिक खोदना होगा।

आपकी सभी मदद के लिए धन्यवाद!

8

यह संभव है कि समय में अंतर एक बदलाव के कारण होता है जब आपके ऑपरेशन के लिए आवश्यक असेंबली लोड हो जाती है।

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

लूप के भीतर कई बार अपना ऑपरेशन करने का प्रयास करें और औसत कम शुरूआती ओवरहेड खोजने के लिए पहले निष्पादन को अनदेखा करें।

अद्यतन: दिलचस्प है कि रिलीज़ मोड में समय डिबग मोड में रहने वालों की तुलना में बहुत कुछ भिन्न हो (एसटीडी देव को रिलीज़ मोड के लिए 100x अधिक है)। निचले सिरे पर, रिलीज मोड समय डीबग मोड में उन लोगों के लिए तुलनीय हैं। आप अपने प्रश्न में उल्लेख करते हैं कि लोड करने के लिए आवश्यक सभी बाल तत्वों के कारण खाता लोड करना गहन है। एक और अंतर वह बिंदु हो सकता है जिस पर रनटाइम कचरा संग्रह करने का फैसला करता है। परीक्षण करने के लिए, आप प्रत्येक ऑपरेशन (आपके टाइमर के बाहर) के बाद System.GC.Collect() निष्पादित करने का प्रयास कर सकते हैं और देख सकते हैं कि इससे चीजें बदली जाती हैं या नहीं।

अद्यतन: तुम वहाँ ताला लगा के संबंध में व्यवहार में बदलाव का हो सकता है संदेह है, आप Windows प्रदर्शन मॉनिटर का उपयोग कर अपने आवेदन की प्रक्रिया (ते), जबकि आप के लिए विभिन्न .NET CLR LocksAndThreads काउंटरों की निगरानी के लिए विचार कर सकते हैं डीबग और रिलीज मोड दोनों में अपने परीक्षण चलाएं। शायद आप कहीं भी लॉक को ठीक तरह से जारी नहीं कर रहे हैं और निष्पादन में देरी हो रही है जब तक कि कुछ टाइमआउट समाप्त न हो जाए? यदि ऐसा है, तो मैं प्रदर्शन काउंटर द्वारा सूचित विवाद दर में वृद्धि देखने की उम्मीद करता हूं। मुझे यकीन नहीं है कि यह रिलीज बिल्ड के लिए केवल एक समस्या क्यों होगी (जब तक कि आप वास्तव में डीबग बिल्ड चलाने पर डीबगर का उपयोग नहीं कर रहे हों)।

+0

मैंने जो किया वह मैंने किया। मुख्य प्रश्न संपादित किया गया। – Lazlo

+0

कचरा कलेक्टर जोड़ा गया, परिणाम नहीं बदला। – Lazlo

+0

जब मैं घर जाता हूं तो मैं आपके दूसरे समाधान का प्रयास कर सकता हूं, लेकिन फिर भी, मुझे नहीं लगता कि यह केवल रिलीज निर्माण को क्यों प्रभावित करेगा। मैंने सभी कमांड लाइन तर्कों का परीक्षण किया, और वे बिल्कुल चरित्र के लिए चरित्र हैं। – Lazlo

2

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

मैं कॉन्फ़िगरेशन के बीच अलग-अलग सेटिंग का ध्यान रखूंगा, फिर प्रत्येक को बदलें ताकि कॉन्फ़िगरेशन मिलान हो, प्रत्येक परिवर्तन के बीच परीक्षण हो। फिर आपको समस्या का स्रोत ढूंढने में सक्षम होना चाहिए।

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

+0

मैंने उन सभी का परीक्षण किया है जिन्हें मैं पा सकता हूं, हालांकि मुझे निम्न नहीं मिल सका: लक्ष्य प्लेटफ़ॉर्म, क्रमबद्धता असेंबली जेनरेट करें, अप्रबंधित कोड डिबगिंग सक्षम करें। इसके अलावा, यह हर लॉकिंग ऑपरेशन को प्रभावित करता है ("थ्रेड-सुरक्षित")। मुझे इसे और अधिक देखना होगा, लेकिन अंतर वास्तव में डीबग और रिलीज के बीच है। रिलीज मोड में, मुझे बेहद अजीब परिणाम मिलते हैं, यहां तक ​​कि अज्ञात पैकेट (मैं एक सर्वर बना रहा हूं)। मुझे लगता है कि यह डीबग/रिलीज में लॉक अंतर की वजह से हो सकता है, लेकिन फिर भी, मुझे नहीं पता कि यह कहां से आता है! मैं एक समाधान के लिए बेताब होना शुरू कर रहा हूँ। – Lazlo