2009-11-28 12 views
5

डेल्फी में विशेष रूप से v2010 में इनलाइनिंग कार्यों या प्रक्रियाओं के साथ क्या चल रहा है, लेकिन मुझे टर्बो डेल्फी के साथ एक ही समस्या थी)?डेल्फी 2010 बेकार इनलाइनिंग?

इसके बारे में मदद में कुछ डिस्काइमर हमेशा "निश्चित मानदंड" के कारण किसी फ़ंक्शन को इनलाइन नहीं कर सकता है।

लेकिन मुझे पता चला है कि आम तौर पर इनलाइन फ़ंक्शन (यहां तक ​​कि बहुत सरल वाले कोड जिनमें 3 या 4 पंक्तियां हैं) गति को बजाए कोड को धीमा कर देती है।

एक अच्छा विचार "सब कुछ इनलाइन" करने के लिए एक कंपाइलर विकल्प होगा। मुझे परवाह नहीं है कि क्या मेरा एक्सई 50% या इससे भी बढ़ता है ताकि यह तेजी से काम कर सके।

क्या कोई तरीका है कि मैं वास्तव में कोड को इनलाइन करने के लिए डेल्फी को मजबूर कर सकता हूं भले ही यह संकलक द्वारा अंतर्निहित होने का निर्णय न लिया जाए? वह वास्तव में मदद करेगा। अन्यथा आपको अपने कोड के कई क्षेत्रों में प्रक्रिया कोड को दोहराने की "मैन्युअल इनलाइनिंग" करने की आवश्यकता है, जैसे कि // // इनलाइनिंग विफल रही है, इसलिए यदि आप अगली 5 लाइनें बदलते हैं, तो उन्हें अन्य 8 डुप्लिकेट स्पॉट में बदलें, यह कोड मौजूद है "

यहां कोई सुझाव?

उत्तर

11

लघु दिनचर्या के स्वचालित इनलाइनिंग के लिए एक कंपाइलर विकल्प है। प्रोजेक्ट विकल्प में, डेल्फी कंपाइलर के तहत -> संकलन -> कोड जनरेशन, ऑटो में "कोड इनलाइनिंग नियंत्रण" चालू करें। हालांकि, जागरूक रहें, कि यह केवल रिलीज बिल्ड पर होना चाहिए, क्योंकि इनलाइन कोड को डीबग करना मुश्किल है।

इसके अलावा, आपने कहा है कि जब तक यह तेज़ हो जाता है तब तक आप अपने प्रोग्राम को बड़ा बनाने में कोई फर्क नहीं पड़ता, लेकिन अक्सर इनलाइनिंग धीमी हो जाती है। आपको अवगत होना चाहिए कि इससे संबंधित हो सकता है। आपके संकलित कोड जितना बड़ा होगा, उतना अधिक निर्देश कैश आपके पास होगा, जो निष्पादन को धीमा कर देता है।

यदि आप वास्तव में अपने प्रोग्राम को गति देना चाहते हैं, तो इसे एक प्रोफाइलर के माध्यम से चलाएं। मैं Sampling Profiler की सलाह देता हूं, जो मुफ़्त है, डेल्फी कोड (2010 सहित) के साथ काम करने के लिए बनाया गया है और आपके निष्पादन को धीमा नहीं करता है। यह आपको एक विस्तृत रिपोर्ट दिखाएगा कि आप वास्तव में किस कोड को निष्पादित कर रहे हैं। एक बार जब आप इसे पा लेते हैं, तो आप बाधाओं पर ध्यान केंद्रित कर सकते हैं और उन्हें अनुकूलित करने का प्रयास कर सकते हैं।

+1

कोड इनलाइन किए जाने वाले स्वत: पर सेट नियंत्रण मदद नहीं की। सैम्पलिंग प्रोफाइलर महान है। वास्तविक आंकड़ों में बाधाएं कहां दिख रही हैं, यह दिखाने में बहुत उपयोगी है। भले ही यह वास्तव में मुझे दिखाया कि मैं पहले से ही नया क्या कर रहा हूं। यह निश्चित रूप से भविष्य में काम में आ जाएगा। धन्यवाद। – TallGuy

3

इनलाइनिंग कुछ मामलों में चीजों को धीमा कर सकती है। रेखांकित फ़ंक्शन स्थानीय चर के लिए आवश्यक CPU रजिस्टरों की संख्या बढ़ा सकता है। यदि पर्याप्त रजिस्ट्रार उपलब्ध नहीं हैं तो वेरिएबल मेमोरी में स्थित होंगे, जो इसे धीमा कर देता है।

यदि फ़ंक्शन को रेखांकित नहीं किया गया है तो इसमें (लगभग) सभी CPU रजिस्ट्रार उपलब्ध होंगे।

मुझे पता चला है कि आमतौर पर लूप युक्त कार्यों को इनलाइन करना एक अच्छा विचार नहीं है। वे कुछ चर का उपयोग करेंगे जो स्मृति में समाप्त होने की संभावना है, जो रेखांकित कोड धीमा कर देता है।

+2

एक निश्चित एल्गोरिथ्म चलाने के लिए आवश्यक बाइट्स की संख्या में वृद्धि, भी अधिक CPU कैश का उपयोग करेगा। दुर्लभ मामलों में इसका असर भी हो सकता है। –

+3

लार्स +1 - सिवाय इसके कि यह दुर्लभ नहीं है। –

1

यदि आप को रेखांकित करने के लिए बल चाहते हैं तो फ़ाइलों को शामिल करें। आपको यह सुनिश्चित करने की ज़रूरत है कि आप सही चर घोषित करें, और फिर {$ I filename.inc} का उपयोग करें। वह हमेशा उस विशिष्ट कोड को इंजेक्ट करेगा जहां आप इसे चाहते हैं, और यदि आपको इसे बदलने की आवश्यकता है तो इसे बनाए रखना आसान बना देगा।

ध्यान रखें कि कंपाइलर लोगों द्वारा स्मार्ट तरीके से लिखा जाता है, तो केवल सबसे अधिक प्राणियों (स्वयं सहित) और इनलाइन करने का निर्णय लेने पर अधिक जानकारी तक पहुंच होती है, इसलिए जब यह इनलाइन नहीं होता है तो शायद इसका एक अच्छा कारण है ।

0

अगर मैं पांचवें वेतन आयोग संकलक devels में से एक समझा (जो एक ही मुद्दा है) सही ढंग से, इनलाइन किए जाने वाले केवल हो सकता है जब नियमित होने के लिए इनलाइन पहले से ही संकलित किया गया।

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

मैं, हैरान नहीं किया जाएगा यह डेल्फी में ही था, क्योंकि यह एक ही सिद्धांत पर आधारित एक इकाई प्रणाली साझा करता है।

यह भी अलग संकलन सिद्धांतों का उल्लंघन किए बिना बहुत unfixable है।

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