2012-12-11 22 views
16

अगर मुझे लगता है, मुझे यकीन है कि जवाब क्लोजर है, लेकिन मुझे यकीन नहीं है कि क्यों। तार्किक रूप से (मेरे लिए) यह ClojureScript की तरह तेजी से किया जाना चाहिए लगता है:जो तेज है, क्लोजर या क्लोजरस्क्रिप्ट (और क्यों)?

दोनों "डायनामिक" हैं, लेकिन ClojureScript

  • जावास्क्रिप्ट को संकलित करता है, वी 8 पर चलने वाले
  • वी 8 इंजन यकीनन सबसे तेजी से गतिशील भाषा इंजन है वहाँ है
  • वी 8 सी में लिखा है

Clojure जबकि:

  • भी गतिशील JVM, जो कोई अंतर्निहित गतिशील समर्थन हासिल है में
  • चलाता है, इसलिए मैं इस प्रकार JVM गतिशील समर्थन
  • सक्षम करने के लिए जो कुछ भी वी 8 भी कर रहा है क्या करना है, है और जावा की तुलना में धीमी है सोच रहा हूँ सी

तो क्लोजरस्क्रिप्ट से क्लोजर तेज कैसे हो सकता है? जावास्क्रिप्ट कहने पर "गतिशील" का अर्थ कुछ अलग होता है और क्लोजर गतिशील होता है? मैं क्या देख रहा हूँ

मुझे लगता है कि (बेशक अगर ClojureScript वास्तव में तेजी से होता है, तो ऊपर सही? तर्क है), क्या Clojure को संकलित करता है .... सवाल के कम से कम हिस्सा है। मुझे पता है कि जेवीएम हिस्सा सिर्फ एक सादा दुभाषिया नहीं हो सकता है (अन्यथा क्लोजरस्क्रिप्ट तेज होगा), लेकिन क्लोजर नियमित बाइटकोड को संकलित नहीं कर सकता है, क्योंकि JVM में कोई "गतिशील" नहीं है। तो ClojureScript कैसे संकलित/निष्पादित किया गया है और कैसे क्लोजर संकलित/निष्कासित किया गया है और कैसे जावा को संकलित/निष्पादित किया गया है, और प्रत्येक में प्रदर्शन अंतर भिन्नता के बीच क्या अंतर है?

+5

"जावा सी से धीमा है" कई समस्या डोमेन के लिए सच हो सकता है, लेकिन यह अप्रासंगिक है। उचित सवाल यह है कि "क्या जावा वी 8 से धीमा है"। V8 आपके कोड को संकलित सी कोड के रूप में नहीं चलाता है, यह एक जावास्क्रिप्ट दुभाषिया है जो सी –

+0

@EricJ में लिखा जाता है। मुझे लगता है कि यह मेरा सवाल है, तो मैं क्लोजर-जेनरेटेड जावास्क्रिप्ट बनाम वी 8 को क्लोजर का अर्थ बताता हूं। वी 8 संकलित करता है कि जेएस नीचे मशीन कोड और इसे चलाता है। जेवीएम क्या तेज़ करता है? – lobsterism

+1

क्लोजर जावा की तरह बाइट कोड में संकलित किया गया है। आपको क्या लगता है कि यह नहीं था? –

उत्तर

24

यह प्रश्न किसी विशिष्ट बेंचमार्क कार्य (या क्लोजर या क्लोजरस्क्रिप्ट के विशिष्ट संस्करणों) के संदर्भ में ठीक से जवाब देना मुश्किल है।

यह कहकर कि, ज्यादातर स्थितियों में मैं क्लोजर को कुछ तेज़ी से होने की उम्मीद करता हूं। कारण:

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

बेशक, किसी भी भाषा में तेज़ या धीमी कोड लिखना संभव है। इससे भाषा कार्यान्वयन के बीच मौलिक अंतर की तुलना में अधिक अंतर आएगा।

और अधिक मौलिक रूप से, क्लोजर और क्लोजरस्क्रिप्ट के बीच आपकी पसंद किसी भी मामले में प्रदर्शन के बारे में नहीं होनी चाहिए। दोनों आकर्षक उत्पादकता फायदे प्रदान करते हैं।मुख्य निर्णायक कारक होना चाहिए:

  • जिसे आप वेब पर चलाने के लिए, ClojureScript
  • का उपयोग आप एक JVM environnment में सर्वर पर चलाना चाहते हैं चाहते का उपयोग करते हैं Clojure
+0

ठीक है, मुझे लगता है कि आपका पहला बिंदु भ्रम का स्रोत था। तो आप कह रहे हैं कि अगर कोई गतिशील सामान "दुर्व्यवहार" कर रहा था और रनटाइम हर समय गतिशील लुकअप कर रहा था, तो कौन जानता है कि कौन तेज़ होगा, लेकिन यह 99% समय और बाइटकोड धड़कता है, वहां कोड का अर्थ नहीं है, सही? क्या आपको पता है कि% प्रदर्शन अंतर क्या होगा? मुझे लगता है कि सादा निष्पादन बाधा है, तो यह जेएस बनाम जावा के समान% अंतर है? – lobsterism

+2

हाँ जावा बनाम जावास्क्रिप्ट शायद अच्छी तरह से अनुकूलित क्लोजर और अच्छी तरह से अनुकूलित क्लोजरस्क्रिप्ट के बीच अनुमानित% अंतर को देगा। संबंधित प्लेटफार्म सीमित कारक हैं, आखिरकार ..... लंबे समय तक आप क्लोजर जावा प्रदर्शन और क्लोजरस्क्रिप्ट की ओर जावास्क्रिप्ट प्रदर्शन की ओर रुख करने की उम्मीद कर सकते हैं क्योंकि कंपेलर बेहतर और बेहतर हो जाते हैं। – mikera

28

असल में, वी 8 सी ++ में लिखा गया है। हालांकि, मूल रूप से JVM के समान ही काम करता है, और JVM सी वी 8 जेआईटी जावास्क्रिप्ट कोड में लिखा गया है और JIT'd कोड निष्पादित करता है। इसी प्रकार जेवीएम जेआईटी संकलित (या हॉटस्पॉट संकलित) बाइटकोड (जावा नहीं) और जेनरेट कोड को निष्पादित करता है।

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

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

जैसा कि आपने कहा था, यह भी कहना सही नहीं है कि JVM बाइटकोड का अर्थ है। 1.0 रिलीज ने 17 साल पहले किया था!

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

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

इसके अतिरिक्त, यह वापस जा सकता है और बाद में उस कोड पर फिर से जा सकता है और यदि आवश्यक हो तो इसे और अधिक अनुकूलन लागू कर सकता है। यह वह बिंदु है जहां हॉटस्पॉट कंपाइलर संकलित सी/सी ++ को हरा करना शुरू कर सकता है। चूंकि इसमें कोड का रनटाइम ज्ञान है, इसलिए यह अनुकूलन लागू कर सकता है कि एक स्थिर सी/सी ++ कंपाइलर नहीं कर सकता है। उदाहरण के लिए, यह आभासी कार्यों को रेखांकित कर सकता है।

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

हॉटस्पॉट का एक नकारात्मक पक्ष यह है कि यह थोड़ा धीमा शुरू होता है। जावा 7 जेवीएम में एक बदलाव जेआईटी कंपाइलर और हॉटस्पॉट कंपाइलर को गठबंधन करना है। यह मोड नया है, हालांकि, और यह डिफ़ॉल्ट नहीं है, लेकिन एक बार प्रारंभिक स्टार्टअप अच्छा होना चाहिए और फिर यह advanced optimizations शुरू कर सकता है कि JVM बहुत अच्छा है।

चीयर्स!

+0

धन्यवाद, मुझे वास्तव में कोई जानकारी नहीं थी कि JVM समर्थित गतिशीलता है। गुगलिंग हालांकि मैं http://blog.fogus.me/2011/10/14/why-clojure-doesnt-need-invokedynamic-but-it-might-be-nice भर में ठोकर खाई, जो दिखाता है कि क्लोजर वास्तव में भी नहीं है उस सुविधा का लाभ उठाएं, लेकिन मुझे यह समझने में भी मदद करता है कि यह अभी भी तेज़ क्यों हो सकता है। – lobsterism

+0

यदि आप पिछले साल से रिच हिकी के क्लोजर कॉंज मुख्य नोट देखते हैं, तो वह उस सुविधा के लिए समर्थन के बारे में बात करता है। यह अच्छा होगा, लेकिन पुराने जेवीएम के साथ समस्याएं होंगी। – Bill

+1

इसके अलावा, मैं आपके प्रश्न का वास्तविक उत्तर जोड़ना भूल गया। निर्भर करता है। ;-) – Bill

1

यह वह जगह है एक ऐतिहासिक टिप्पणी के रूप में इतना जवाब नहीं: हॉटस्पॉट वीएम और वी 8 जेएस इंजन दोनों की उत्पत्ति सूर्य माइक्रोसिस्टम्स में स्वयं प्रोजेक्ट के लिए हो सकती है, जो मुझे लगता है कि बहुत सारी तकनीक प्रोटोटाइप की जाती है जो उन्हें तेजी से चलाने की अनुमति देती है कर। दोनों की तुलना करते समय विचार करने के लिए कुछ। मैं इसे एक टिप्पणी के रूप में पोस्ट कर दूंगा लेकिन प्रतिष्ठा प्रणाली ने मुझे रोक दिया।