2009-04-21 20 views
5

की तुलना में धीमे काम करने का निर्माण करता है, मुझे पिछले कुछ दिनों से अजीब चीज का सामना करना पड़ रहा है। मुझे पता चला कि मेरा रिलीज बिल्ड वास्तव में डीबग संस्करण की तुलना में धीमी निष्पादित करता है।.Net रिलीज डीबग

समस्या

मैं अंत में मेरे Windows में मेरा प्रवेश बिंदु (मुख्य) से सभी सामान छीन 1. exe फॉर्म्स, केवल इस छोड़ने:

[STAThread] 
static void Main(params string[] args) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    System.Xml.Serialization.XmlSerializer xmlS = 
     new System.Xml.Serialization.XmlSerializer(typeof(TestClass)); 
    sw.Stop(); 
    MessageBox.Show(sw.Elapsed.ToString()); 
} 

इसलिए मैं वास्तव में instantiating नहीं कर रहा हूँ किसी भी फॉर्म अब, केवल परीक्षण। एक छोटी सी कक्षा है जिसमें केवल तीन सार्वजनिक int गुण हैं और कुछ भी नहीं। मेरा मुख्य .exe (विंडोज़ फॉर्म) ~ 1 एमबी बड़ा है, अगर इससे कोई फर्क पड़ता है।

2. परिणाम

डीबग मोड में, मेरा बीता हुआ समय जबकि रिलीज में यह ~ 1.2s लेता है, ~ 200 मि.से है।

3. अतिरिक्त जानकारी

अजीब बात है जब मैं, स्टार्टअप परियोजना के रूप में है कि समाधान में कुछ अन्य परियोजना स्थापित करने के लिए है, क्योंकि उस मामले में यह (जैसा कि ऊपर बिल्कुल एक ही कोड) तेजी से काम करता है की कोशिश करो।

4. त्वरित हैक

जितनी जल्दी संभव हो इस बग को ठीक करने के लिए, मैं अपने समाधान है, जो को दर्शाता है और मेरी पहली प्रविष्टि परियोजना का हवाला मुख्य आवेदन पत्र चलाता है में एक नया .exe स्टार्टअप प्रोजेक्ट बनाया। उस स्थिति में यह फिर से काम करता है, मेरी प्रविष्टि exe अब केवल 24kb बड़ी है, जिसमें केवल एक स्थिर मुख्य विधि है।

क्या किसी को भी पहले इसी तरह के व्यवहार का सामना करना पड़ा है? अगर मैं कहीं और इस पर ठोकर खा गया था, ऊपर दिए गए कोड को देखकर, शायद मुझे लगता है कि एक स्थिर प्रारंभिक यंत्र है, एक अलग धागे में काम कर रहा है (लेकिन यह मामला यहां नहीं है, मेरे पास यह नहीं है सामान), और इसके अलावा रिलीज बिल्ड में ही चल रहा है?

[संपादित करें] अधिक जानकारी: मुझे पता है कि XmlSerializer रनटाइम में आईएल कोड उत्पन्न करता है, लेकिन मेरा वास्तविक सवाल यह है कि यह अन्य मामलों की तुलना में इस मामले में धीमी गति से क्यों काम करता है। जब मैं केवल वास्तविक क्रमबद्धता को बेंचमार्क करता हूं, तो रिलीज में यह 3x धीमी है (लेकिन केवल अगर मैं इसे अपनी प्रारंभिक परियोजना से चलाता हूं)।

[अपडेट] अब पहले से अजीब भाग के लिए: के बाद संशोधित/चरणों के पुनर्निर्माण की एक जोड़ी, मेरी नई प्रविष्टि परियोजना पहले एक के रूप में व्यवहार करने के लिए शुरू कर दिया - धीमी स्टार्टअप, धीमी गति से लोड। मैंने प्रोजेक्ट का नाम और GUID बदल दिया और इसे फिर से बनाया और यह फिर से काम कर रहा है।

+0

मान लें कि XmlSerializer वास्तविक क्रमबद्धता को संभालने के लिए रनटाइम पर एक कक्षा उत्पन्न करता है। यह सी # कोड उत्पन्न करता है और इसे रनटाइम पर संकलित करता है। –

+0

मैं समझता हूं, लेकिन मुझे समझ में नहीं आता कि यह मेरे रिलीज एक्सई एप्लिकेशन में हमेशा धीमा क्यों होता है।इसके अलावा, मैं XmlSerializer को तुरंत चालू कर सकता हूं, उदाहरण के लिए 10s के लिए सो सकता हूं, और फिर बेंचमार्क के लिए वास्तविक क्रमबद्धता 1000 टाइमर करें - और यह हमेशा रिलीज़ में धीमा रहता है। – Groo

उत्तर

6

मुझे लगता है कि संभवतः ऐसा इसलिए है क्योंकि XmlSerializer एनजीएन-आईएसएच रिलीज मोड में स्टार्टअप समय पर काम करता है, लेकिन डीबग मोड में नहीं। उदाहरण देखें

http://blogs.msdn.com/billwert/archive/2008/02/23/use-of-sgen-exe-to-avoid-common-xmlserializer-performance-pitfalls.aspx

कुछ विवरण के लिए

+0

धन्यवाद, मैंने वास्तव में रिलीज मोड में क्रमबद्धता असेंबली उत्पन्न करने के लिए एसजीईएन का उपयोग किया, लेकिन यह वैसे भी धीमा था। जब मैं पहले एक धारावाहिक बनाता हूं तो यह धीमा होता है और फिर केवल क्रमबद्धता को बेंचमार्क करता है। (वैसे, आपका लिंक इसे मोज़िला में दिखाता है: "www.topxml.com पर वेबसाइट को हमला साइट के रूप में रिपोर्ट किया गया है") – Groo

+0

हां, वही चेतावनी प्राप्त करें। इसके अलावा Google इस साइट के बारे में चेतावनी देता है: http://www.google.de/search?hl=de&q=site%3Awww.topxml.com –

+0

धन्यवाद, मैंने मूल msdn ब्लॉग पर यूआरएल तय किया है। – Brian

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