इनलाइन का उपयोग रुस्ट में कब किया जाना चाहिए?


86

रस्ट में एक "इनलाइन" विशेषता होती है जिसका उपयोग उन तीन फ्लेवर्स में से एक में किया जा सकता है:

#[inline]

#[inline(always)]

#[inline(never)]

इनका उपयोग कब किया जाना चाहिए?

जंग के संदर्भ में, हम एक इनलाइन विशेषताएँ अनुभाग कहते हैं

संकलक आंतरिक heuristics के आधार पर स्वचालित रूप से कार्य करता है। गलत तरीके से इनलाइनिंग कार्य वास्तव में कार्यक्रम को धीमा बना सकते हैं, इसलिए इसका उपयोग देखभाल के साथ किया जाना चाहिए।

रस्ट इंटर्नल्स फोरम में, ह्यूइन इनलाइन निर्दिष्ट करने के बारे में भी रूढ़िवादी था ।

लेकिन हम रूस्ट स्रोत में काफी उपयोग देखते हैं , जिसमें मानक पुस्तकालय भी शामिल है। एक-लाइन-फ़ंक्शंस में बहुत से इनलाइन विशेषताओं को जोड़ा जाता है, जो संकलक के लिए संदर्भ के अनुसार ह्यूरिस्टिक्स के माध्यम से स्पॉट और ऑप्टिमाइज़ करना आसान होना चाहिए। क्या वास्तव में उन की जरूरत नहीं है?

जवाबों:


70

वर्तमान रस्ट कंपाइलर की एक सीमा यह है कि यदि आप LTO (लिंक-टाइम ऑप्टिमाइजेशन) का उपयोग नहीं कर रहे हैं, तो यह कभी भी फंक्शन को चिन्हित नहीं करेगा #[inline]। Rust C ++ के समान एक अलग संकलन मॉडल का उपयोग करता है क्योंकि LLVM का LTO कार्यान्वयन बड़ी परियोजनाओं के लिए अच्छा नहीं है। इसलिए, अन्य बक्से के संपर्क में आने वाले छोटे कार्यों को हाथ से चिह्नित करने की आवश्यकता होती है। यह एक महान स्थिति नहीं है, और भविष्य में एलटीओ और एमआईआर इनलाइनिंग के सुधार के कुछ संयोजन द्वारा इसे ठीक किए जाने की संभावना है।

#[inline(never)]डिबगिंग के लिए कभी-कभी उपयोगी होता है (कोड का एक टुकड़ा अलग करना जो अपेक्षित रूप से काम नहीं कर रहा है)। सिद्धांत रूप में, इसका उपयोग बेंचमार्किंग के लिए किया जा सकता है, लेकिन यह आमतौर पर एक बुरा विचार है: इनलाइन को बंद करने से अन्य अंतर-प्रक्रियात्मक अनुकूलन जैसे निरंतर प्रसार को नहीं रोका जा सकता है। सामान्य कोड के संदर्भ में, यह कोड को कम कर सकता है यदि आपके पास अक्सर उपयोग किया जाने वाला सहायक कार्य है जो केवल त्रुटि से निपटने के लिए उपयोग किया जाता है।

#[inline(always)]आम तौर पर बुरा विचार है; यदि कोई फ़ंक्शन पर्याप्त बड़ा है, तो कंपाइलर इसे डिफ़ॉल्ट रूप से इनलाइन नहीं करेगा, तो यह पर्याप्त बड़ा है कि कॉल का ओवरहेड कोई फर्क नहीं पड़ता (और अत्यधिक इनलाइनिंग अनुदेश कैश दबाव बढ़ाता है)। अपवाद हैं, लेकिन आपको इसे सही ठहराने के लिए प्रदर्शन माप की आवश्यकता है। यह उदाहरण उस स्थिति की तरह है जहां यह विचार करने लायक है। कोड गुणवत्ता में #[inline(always)]सुधार करने के लिए भी इस्तेमाल किया जा सकता है -O0, लेकिन यह आमतौर पर चिंता का विषय नहीं है।


19
ध्यान दें कि inline(never)पैनिक इंट्रेंसिक्स पर उपयोग किया जाता है, यह सुनिश्चित करने के लिए कि ऑप्टिमाइज़र इनलाइन फ़ंक्शंस नहीं करता है जिसे केवल पैनिक केस में कहा जाता है।
oli_obk

4
-1 क्योंकि पहले बिंदु से कुछ गायब है। जेनेरिक आइटम को क्रेट के पार इन-लाइन किया जा सकता है, क्योंकि वे तुरंत तैयार होने पर प्रभावी रूप से संकलित किए जाते हैं, इसलिए इनलाइनिंग के लिए आवश्यक कोड आसानी से उपलब्ध है। और इसका मतलब है कि बड़ी संख्या में ऐसे आइटम जिन्हें चिह्नित नहीं किया गया है, अभी भी इन-क्रॉस क्रॉस-इनलेट हो सकते हैं। कुछ प्रकार के बेसिक लाइब्रेरी क्रेट्स में, प्रत्येक आइटम सामान्य है!
कलंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.