2009-04-15 14 views
10

मैं सी # (मूल रूप से एक मल्टीट्रैक संपादक) में एक डीएसपी अनुप्रयोग लिख रहा हूं। मैं इसे विभिन्न मशीनों पर काफी समय से प्रोफाइल कर रहा हूं और मैंने कुछ 'उत्सुक' चीजों को देखा है।एप्लिकेशन के दौरान सबसे अनुकूलित कोड उत्पन्न करने के लिए .NET JIT कंपाइलर को मजबूर करना

मेरी होम मशीन पर, प्लेबैक लूप का पहला भाग उपलब्ध समय का लगभग 50% -60% लेता है, (मुझे लगता है कि यह जेआईटी अपनी नौकरी कर रहा है), फिर बाद के लूप के लिए यह नीचे चला जाता है एक स्थिर 5% खपत के लिए। समस्या यह है कि, यदि मैं धीमे कंप्यूटर पर एप्लिकेशन चलाता हूं, तो पहला रन उपलब्ध समय से अधिक लेता है, जिससे प्लेबैक बाधित हो जाता है और आउटपुट ऑडियो को गड़बड़ कर दिया जाता है, जो अस्वीकार्य है। उसके बाद, यह 8% -10% खपत तक चला जाता है।

पहले भाग के बाद भी, एप्लिकेशन समय-समय पर (प्रत्येक 2 सेकंड अधिक या कम) कुछ समय लेने वाली दिनचर्या को कॉल करता रहता है, जिससे स्थिर 5% खपत 20% -25% की बहुत कम चोटियों का अनुभव करती है। । मैंने देखा है कि अगर मैं थोड़ी देर के लिए आवेदन चलाता हूं तो ये चोटियों में भी 7% -10% की कमी आएगी। (मुझे यकीन नहीं है कि यह जेआईटी कोड के इन हिस्सों को दोबारा बनाने के कारण है)।

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

मैं यह जानना चाहता हूं कि आप क्या सोचते हैं।

(NGEN आवेदन एक विकल्प, मुझे पसंद है और सभी JIT अनुकूलन मैं प्राप्त कर सकते हैं चाहता हूँ नहीं है।)

संपादित करें:

मेमोरी की खपत और कचरा संग्रहण किक भी कोई समस्या नहीं है, मैं कर रहा हूँ प्लेबैक के दौरान ऑब्जेक्ट पूल और मेमोरी की अधिकतम चोटी का उपयोग 304 Kb है।

+1

यदि आप कहते हैं तो यह मदद करेगा ** क्यों ** एनजीईएन एक विकल्प नहीं है; समस्या को समझना आधे नौकरी है ... –

+0

एनजीएन-आईएनजी में क्या जेआईटी अनुकूलन उपलब्ध नहीं हैं? – Will

+0

@Marc: मैं ऐप को आखिरी उपाय के रूप में एनजेन करता हूं, लेकिन यदि कोई बेहतर समाधान उपलब्ध है तो मैं इसका उपयोग नहीं करना चाहूंगा। – Trap

उत्तर

16

आप JIT कम्पाइलर ट्रिगर कर सकते हैं PrepareMethod ... विधि (NGen का उपयोग किए बिना) के उपयोग के दौरान अपने एप्लिकेशन के आरंभिक दिनचर्या के दौरान असेंबली के अपने पूरे सेट को संकलित करने के लिए।

इस समाधान को यहां अधिक विस्तार से वर्णित किया गया है: Forcing JIT Compilation During Runtime

4

प्रारंभिक गति वास्तव में फ़्यूज़न + जेआईटी की तरह लगती है, जिसे आईएलएमर्ज (फ्यूजन के लिए) और एनजीईएन (जेआईटी के लिए) द्वारा मदद की जाएगी; आप स्टार्टअप पर सिस्टम के माध्यम से हमेशा एक मूक ट्रैक खेल सकते हैं ताकि उपयोगकर्ता बिना किसी विकृति को देखते हुए कड़ी मेहनत कर सके?

एनजीईएन एक अच्छा विकल्प है; क्या कारण है जिसका आप इसका उपयोग नहीं कर सकते?

मुद्दों आप के बाद प्रारंभिक लोड नहीं ध्वनि करना जैसे वे JIT से संबंधित हैं का उल्लेख है। शायद कचरा संग्रह।

क्या आपने प्रोफाइलिंग करने का प्रयास किया है? सीपीयू और मेमोरी (संग्रह) दोनों?

+0

मेरे लिए नाजन का उपयोग न करने का एकमात्र कारण यह होगा कि इसे स्थापना के दौरान प्रशासनिक विशेषाधिकारों की आवश्यकता होती है, इस प्रकार कॉर्पोरेट नेटवर्क पर प्रति-उपयोगकर्ता प्रतिष्ठानों पर लागू नहीं होती है। शायद ओपी के लिए भी यही कारण है? –

+0

तब एनजीएनएन को इंस्टॉल करने के विकल्प के रूप में क्यों न करें? तो अगर आपके पास प्रशासन अधिकार हैं, तो इसे करें। अन्यथा उपयोगकर्ता को चेतावनी दें और ऐसा न करें। –

3

जैसा कि मार्क ने उल्लेख किया है, चल रहे स्पाइक जेआईटी मुद्दों की तरह नहीं हैं। अन्य चीजों को देखने के लिए:

  • कचरा संग्रह - क्या आप अपनी ऑडियो प्रोसेसिंग के दौरान स्मृति आवंटित कर रहे हैं? यदि आप बहुत सारे कचरा बना रहे हैं, या यहां तक ​​कि ऑब्जेक्ट्स जो जेन 0 संग्रह से बचते हैं, तो इससे उल्लेखनीय स्पाइक्स हो सकते हैं। ऐसा लगता है कि आप किसी प्रकार का प्री-आवंटन कर रहे हैं, लेकिन लाइब्रेरी कोड में छुपा आवंटन के लिए देखें (यहां तक ​​कि एक फोरैच लूप भी आवंटित कर सकता है!)

  • डेनॉर्मल्स। बहुत छोटे फ्लोटिंग पॉइंट नंबरों से निपटने के दौरान कुछ प्रकार के प्रोसेसर के साथ कोई समस्या है जो सीपीयू स्पाइक्स का कारण बन सकती है। विवरण के लिए http://www.musicdsp.org/files/denormal.pdf देखें।

संपादित करें:

आप NGen, कम से कम एक NGen'd संस्करण की तुलना उपयोग करें ताकि आप देख सकते हैं कि अंतर JITing बनाता है नहीं करना चाहती यहां तक ​​कि अगर

+1

दिलचस्प। मुझे कोई सुराग नहीं था कि denormals इतनी राक्षसी गति टक्कर थे। –

2

यदि आपको लगता है कि आप जेआईटी द्वारा प्रभावित हो रहे हैं, तो अपने ऐप को एनजीएनएन के साथ प्रीकंपाइल करें और परीक्षण फिर से चलाएं। कोड में कोई जेआईटी ओवरहेड नहीं है जिसे एनजीईएन द्वारा संकलित किया गया है। यदि आप अभी भी NGEN'd ऐप में स्पाइक्स देखते हैं, तो आप जानते हैं कि वे जेआईटी के कारण नहीं हैं।

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

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