2017-10-21 36 views
8

कोटलिन corutines परिमित राज्य मशीन और कुछ कार्य धावक (उदाहरण के लिए, डिफ़ॉल्ट फोर्कजोइनपूल) के लिए चीनी है। https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-detailsकौन सा कोरआउट (गोराउटिन और कोटलिन कोरआउट) तेजी से हैं?

दूसरे शब्दों में, जावा/कोटलिन रनटाइम में अभी तक कोई रनटाइम कोरआउट नहीं है (लेकिन यह http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html के साथ बदल सकता है)। कोटलिन कोरोटाइन केवल कार्यों का अनुक्रमिक है, जिसे एक-एक करके निष्पादित किया जाता है। प्रत्येक कार्य थ्रेड पूल से किसी भी धागे में निष्पादित किया जा सकता है।

गो रनटाइम "coroutines" का समर्थन करता है। लेकिन goroutines असली coroutines नहीं है। गोरोटाइन्स कार्यक्रम में उपज बिंदु सेट करने की अनुमति नहीं देता है। इसके अलावा, गो कस्टम थ्रेड पूल सेट करने की अनुमति नहीं देता है। आप डिफ़ॉल्ट पूल में केवल थ्रेड का आकार सेट कर सकते हैं।

कोटलिन कोरोटाइन और गोरोटाइन के बीच पहला अंतर गो रनटाइम प्रबंधन है जो इस समय कोरआउट चल रहा है। जब कुछ आईओ ऑपरेशन (या सिंक्रनाइज़ेशन प्राइमेटिव्स) पर गोरौटाइन अवरुद्ध हो जाते हैं, तो इसे निष्पादित करने के लिए अगली नौकरी को चुनें। जेवीएम में ऐसी शर्तों में कोई बौद्धिक नौकरी स्विचिंग नहीं है।

इस वजह से, गो वर्तमान में चल रहे नौकरी को सस्ते रूप से बदल सकते हैं। जाओ केवल कुछ रजिस्ट्रियों को बदलना है https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ। लेकिन कुछ लोग कहते हैं, कि जेवीएम रजिस्टरों का उपयोग करने के बजाय धागे के ढेर का उपयोग कर सकता है। तो रजिस्टरों की कोई बचत और लोडिंग बिल्कुल नहीं है।

कोटलिन कोरोटाइन और गोरोटाइन के बीच दूसरा अंतर कोरआउटिन का प्रकार है। कोटलिन कोरआउट्स बेकार कोरआउटिन है। गोरौटाइन स्टैक्फुल कोरआउट हैं। कोटलिन कोरआउट के सभी राज्य कोटलिन संदर्भ में संग्रहीत किया जाता है, जो ढेर में संग्रहीत होता है। गोरोटाइन्स राज्य रजिस्टरों और थ्रेड स्टैक में संग्रहीत है।

मैं जानना चाहता हूं कि आईओ बाध्य कार्यों में कौन से कोरआउट (गोरौटाइन और कोटलिन कोरआउट) तेजी से हैं? सीपीयू बाध्य कार्य? स्मृति खपत के बारे में क्या?

+0

"स्टैकफुल कोरआउटिन" और "स्टैकलेस कोरआउट" के बीच भेद बीमार परिभाषित और मूक है। विवरण के लिए मेरी जेवीएमएलएस टॉक देखें: https://www.youtube.com/watch?v=3xalVUY69Ok –

उत्तर

24

कोटलिन में कोरोटाइन गो में गोरोटाइन्स की तुलना में एक अलग तरीके से कार्यान्वित किए जाते हैं, इसलिए कौन सा "तेज़" उस समस्या पर निर्भर करता है जिसे आप हल कर रहे हैं और जिस तरह का कोड आप लिख रहे हैं।

सामान्य रूप से, यह पहले से ही यह बताना मुश्किल है कि आपके पास एक समस्या के लिए बेहतर काम करने जा रहा है। इसे समझने के लिए आपको अपने विशेष वर्कलोड के लिए बेंचमार्क चलाना होगा। हालांकि, यहां महत्वपूर्ण मतभेदों का एक सामान्य सारांश है जो आपको कुछ मार्गदर्शन देना चाहिए।

  • कोटलिन कोरआउट के लिए गो गोरोटाइन्स की तुलना में प्रति साधारण उदाहरण कम स्मृति की आवश्यकता होती है। कोटलिन में एक साधारण कोरआउटिन हीप मेमोरी के केवल कुछ दर्जन बाइट्स पर कब्जा करता है, जबकि गो गोराउटिन 4KiB स्टैक स्पेस के साथ शुरू होता है। इसका मतलब यह है कि यदि आप सचमुच लाखों कोरआउटिन रखने की योजना बना रहे हैं, तो कोटलिन में कोरआउटिन आपको गो बनाम किनारे दे सकते हैं। यह कोटलिन कोरआउट भी जेनरेटर और आलसी अनुक्रमों जैसे बहुत ही अल्पकालिक और छोटे कार्यों के लिए बेहतर अनुकूल बनाता है।

  • कोटलिन कोरआउट्स किसी भी स्टैक गहराई पर जा सकते हैं, हालांकि निलंबन समारोह के प्रत्येक आमंत्रण वस्तु को ढेर में ऑब्जेक्ट आवंटित करता है। कोटलिन कोरोटाइन में एक आमंत्रण ढेर वर्तमान में ढेर वस्तुओं की एक लिंक्ड सूची के रूप में लागू किया जाता है। इसके विपरीत, जाओ गोराउटिन गो में रैखिक स्टैक स्पेस का उपयोग करें। यह गहरे ढेर पर निलंबन को गो में अधिक कुशल बनाता है। इसलिए, यदि आप जिस कोड को लिख रहे हैं, वह ढेर से बहुत गहराई से निलंबित हो जाता है, तो आप पाएंगे कि goroutines आपके लिए अधिक कुशल हैं।

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

  • गो रनटाइम भौतिक ओएस धागे पर goroutines निष्पादन शेड्यूलिंग का पूरा नियंत्रण लेता है। इस दृष्टिकोण का लाभ यह है कि आपको इसके बारे में सोचना नहीं है। कोटलिन कोरआउट के साथ आपके कोरआउटिन के निष्पादन पर्यावरण पर आपके पास बढ़िया नियंत्रण होता है। यह त्रुटि-प्रवण है (उदाहरण के लिए आप बस कई अलग-अलग थ्रेड-पूल बना सकते हैं और उनके CPU संदर्भ को उनके बीच संदर्भ स्विचिंग पर बर्बाद कर सकते हैं)। हालांकि, यह आपको अपने आवेदन के लिए अपने थ्रेड आवंटन और संदर्भ स्विच को सुदृढ़ करने की क्षमता देता है। उदाहरण के लिए, कोटलिन में ओएस थ्रेड के बीच स्विचिंग संदर्भों को पूरी तरह से लिखने के लिए पूरी तरह से एक ओएस थ्रेड (या थ्रेड पूल) में अपने पूरे एप्लिकेशन या उसके कोड का सबसेट निष्पादित करना आसान है।

+0

«कोड में कहने का कोई तरीका नहीं है" एक ही ओएस थ्रेड पर इन goroutines चलाएं "।» 100% सच नहीं है : 'runtime.LockOSThread()' कॉल कॉलिंग goroutine को ओएस थ्रेड पर लॉक करता है जो वर्तमान में चल रहा है। यह सुनिश्चित करेगा कि कॉलिंग goroutine हमेशा उसी धागे पर निर्धारित किया जाएगा और कोई अन्य goroutine होगा। ओटीओएच, बहुत ही दुर्लभ मामलों को छोड़कर, इसकी आवश्यकता नहीं होती है, और वास्तव में अक्सर काउंटर-उत्पादक होता है क्योंकि गो शेड्यूलर यह सुनिश्चित करने के लिए बहुत मेहनत करता है कि थ्रेड से निकाली गई गोरौटाइन फिर से निर्धारित हो, यदि संभव हो तो। – kostix

+1

@ मैक्स, इस क्लासिक निबंध को पढ़ने पर विचार करें (http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/) समेकन-जैसी-पुस्तकालय के बीच अंतर पर और समवर्ती-के माध्यम से रनटाइम-शेड्यूलर भेद (यहां: जावा + कुछ भी बनाम जाओ)। – kostix

+0

@ कोस्टिक्स धन्यवाद। सटीकता के लिए इस खंड को हटाकर सुधार किया गया। –

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