सिद्धांत रूप में, एक बार बाइट-कोड संकलित और लोड है, यह हमेशा कम से कम के रूप में तेजी से मूल एएसटी दुभाषिए के रूप में व्याख्या की जानी चाहिए। कुछ कोड बड़े स्पीडअप से लाभान्वित होंगे, यह आमतौर पर बहुत से स्केलर ऑपरेशंस और लूप के साथ कोड होता है जहां आर व्याख्या में अधिकतर समय व्यतीत होता है (मैंने 10x स्पीडअप के साथ उदाहरण देखे हैं लेकिन मनमाने ढंग से माइक्रो-बेंचमार्क वास्तव में इसे आवश्यकतानुसार बढ़ा सकते हैं)। कुछ कोड एक ही गति से चलेंगे, यह आमतौर पर कोड अच्छी तरह से वेक्टरकृत होता है और इसलिए व्याख्या में लगभग कोई समय नहीं लगाता है। अब, संकलन खुद धीमा हो सकता है। इसलिए, समय-समय पर संकलक अब कार्यों को संकलित नहीं करता है जब यह अनुमान लगाता है कि यह भुगतान नहीं करेगा (और समय के साथ हेरिस्टिक बदलता है, यह पहले से ही 3.4.x में है)। हेरिस्टिक्स हमेशा इसे सही नहीं मानते हैं, इसलिए ऐसी परिस्थितियां हो सकती हैं जब संकलन का भुगतान नहीं किया जाएगा। विशिष्ट समस्याग्रस्त पैटर्न कोड पीढ़ी, कोड संशोधन और बंद होने पर कब्जे वाले वातावरण की बाइंडिंग में हेरफेर हैं।
पैकेज समय-समय पर बाइट-संकलित किए जा सकते हैं ताकि कम से कम समय पर ज्ञात कोड के लिए संकलन लागत का भुगतान (बार-बार) नहीं किया जा सके। यह अब आर के विकास संस्करण में डिफ़ॉल्ट है। संकलित कोड की लोडिंग इसे संकलित करने से बहुत तेज है, कुछ स्थितियों में कोई भी कोड को लोड कर सकता है जिसे निष्पादित नहीं किया जाएगा, इसलिए वास्तव में एक ओवरहेड हो सकता है, लेकिन कुल मिलाकर पूर्व संकलन फायदेमंद है। हाल ही में जीसी के कुछ पैरामीटर को लोड करने वाले कोड की लागत को कम करने के लिए ट्यून किया गया है जिसे निष्पादित नहीं किया जाएगा।
पैकेज लेखकों के लिए मेरी सिफारिश डिफ़ॉल्ट का उपयोग करना होगा (केवल समय-समय पर संकलन रिलीज संस्करणों में डिफ़ॉल्ट रूप से चालू है, पैकेज स्थापना समय पर बाइट-संकलन अब विकास संस्करण में है)। अगर आपको एक उदाहरण मिलता है जहां बाइट-कोड कंपाइलर अच्छा प्रदर्शन नहीं करता है, तो कृपया एक बग रिपोर्ट सबमिट करें (मैंने पिछले संस्करणों में rpart
से जुड़े मामले को भी देखा है)। मैं कोड पीढ़ी और कोड मैनिपुलेशन के खिलाफ और विशेष रूप से गर्म लूप में अनुशंसा करता हूं। इसमें क्लोजर द्वारा कैप्चर किए गए वातावरण में बंद करने, हटाने और डाइंडिंग को सम्मिलित करना शामिल है। निश्चित रूप से गर्म लूप में eval(parse(text=
नहीं करना चाहिए (और यह बाइट-संकलन के बिना पहले से ही खराब था)। गतिशील रूप से नए बंद (शाखाओं के बिना) उत्पन्न करने की तुलना में शाखाओं का उपयोग करना हमेशा बेहतर होता है। साथ ही बड़े अभिव्यक्तियों (बिना लूप के) कोड को गतिशील रूप से उत्पन्न करने की तुलना में लूप के साथ कोड लिखना बेहतर होता है। अब बाइट-कोड कंपाइलर के साथ, अब आर में स्केलर्स पर चलने वाले लूप लिखना ठीक है (प्रदर्शन पहले की तरह खराब नहीं होगा, इसलिए प्रदर्शन महत्वपूर्ण भागों के लिए सी पर स्विच किए बिना कोई अक्सर दूर हो सकता है) ।
स्रोत
2018-03-06 14:20:20
मुझे प्रदर्शन हिट (प्रारंभिक संकलन (और शायद स्मृति उपयोग में वृद्धि) के अलावा) के बारे में निश्चित नहीं है, लेकिन "नोट: कोई दृश्यमान बाध्यकारी" संदेश अक्सर नौसिखिया के लिए जबरदस्त नहीं हो सकता है (उदाहरण के लिए, ggplot2 का उपयोग करते हुए) और कर सकते हैं टैब-पूर्ण को फेंक दें (कम से कम, वे मेरे लिए हैं) – mweylandt
हाय mweylandt। क्या आपको पता है कि उस त्रुटि मालिश का मतलब क्या है? –
मैं अपने संकुल की विवरण फ़ाइल में 'बाइटकंपाइल: सत्य' डाल रहा हूं क्योंकि मैं नए संस्करण बना रहा हूं और ऐसा लगता है कि यह ठीक काम करता है। मैंने एक छोटा परीक्षण किया 'http: // www.johnmyleswhite.com/नोटबुक/2012/03/31/जुलिआ-आई-लव-आप/टिप्पणी-पृष्ठ -1/# टिप्पणी -192222' और बाइट संकलित संस्करण, ' fib2c' सामान्य से अधिक 4x तेज चला गया, 'fib2a'। कुछ मामलों में आर पहले से ही बाइट संकलन के बिना भी तेज है (उदाहरण के लिए सी का उपयोग कर अत्यधिक वेक्टरकृत कोड) और उन मामलों में स्पष्ट रूप से गति के लिए थोड़ा अवसर है - यह मुख्य रूप से धीमी आर कोड के लिए उपयोगी है। –