जावा संकलित गति बनाम स्काला संकलन गति


101

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

लेकिन मैं जावा से आ रहा हूं, जैसा कि मैं इसे समझता हूं, किसी भी अन्य संकलित भाषा की तुलना में तेज है, और उन कारणों के कारण तेज है जो मैंने स्काला पर स्विच किया है (यह एक बहुत ही सरल भाषा है)।

इसलिए मैं पूछना चाहता था, क्या मैं स्काला को अधिक तेज बना सकता हूं और कभी भी जेवैक के समान तेज होगा।


ऐसा लगता है कि कुछ उपयोगकर्ता आपसे सहमत हैं;) twitter.com/etorreborre/status/21286172202
VonC

जावा से अधिक तेजी से संकलित करें। तेजी से रास्ता, जो कुछ कह रहा है।
डैनियल सी। सोबरल

अहा, मेरे मामले में कुछ हाउंड्रेड्स एलओसी के साथ औसत स्केलैक संकलन के लिए कई मिनट लगते हैं, एफएससी थोड़ा तेज है।
यरीहो 31:10

जवाबों:


57

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

कहा कि, संकलन समय पहले से ही स्केल 2.7 से स्केल 2.8 तक जाने में पहले से ही सुधार हुआ है, और मुझे उम्मीद है कि अब सुधार जारी रहेगा कि धूल 2.8 पर बस गई है। यह पृष्ठ स्काला संकलक के प्रदर्शन को बेहतर बनाने के लिए चल रहे कुछ प्रयासों और विचारों का दस्तावेज है।

मार्टिन ओडस्की अपने उत्तर में अधिक विस्तार प्रदान करते हैं।


1
क्या यह पृष्ठ ( lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded ) अधिक नहीं है ?
VonC

मैंने netbeans से लेकर ant + jedit तक स्विच किया है (मुझे पता है कि मुझे पता है, चींटी गुफाओं के लिए है, लेकिन मैं अपने समय पर विकसित होऊंगा) ताकि मैं fsc का उपयोग कर सकूं। लेकिन मैं सोच रहा था, क्लजुरे की संकलन गति स्काला से कैसे मिलती है? ऐसा लगता है कि स्काला में कई विशेषताएं हैं लेकिन मुझे लगता है कि वाक्यविन्यास बहुत आसान है।
user405163

1
हम यहाँ थोड़े से विषय पर विचार कर रहे हैं, लेकिन क्लोजर का कंपाइलर तेजी से (समकक्ष स्रोतों पर जावैक की तुलना में बहुत तेज़) है। आप सही कह रहे हैं कि यह वास्तव में सरल भाषा है, और इसमें किसी भी प्रकार की स्थैतिक प्रकार की प्रणाली नहीं है, जो काफी मदद करता है।
डैनियल स्पाइवेक

458

स्काला संकलक के लिए गति में (कमी) दो पहलू हैं।

  1. ग्रेटर स्टार्टअप ओवरहेड

    • स्केलक में ही बहुत सारी कक्षाएं होती हैं, जिन्हें लोड और जीट-संकलित करना होता है

    • स्केलक को सभी रूट पैकेज और फाइलों के लिए क्लासपाथ को खोजना होगा। आपके वर्गपथ के आकार के आधार पर यह एक से तीन अतिरिक्त सेकंड ले सकता है।

    कुल मिलाकर, 4-8 सेकंड के स्केलप के स्टार्टअप ओवरहेड की अपेक्षा करें, यदि आप इसे पहली बार चलाते हैं तो डिस्क-कैश नहीं भरे जाते हैं।

    स्टार्टअप ओवरहेड के लिए स्काला का जवाब या तो fsc का उपयोग करना है या sbt के साथ निरंतर निर्माण करना है। IntelliJ को या तो विकल्प का उपयोग करने के लिए कॉन्फ़िगर करने की आवश्यकता है, अन्यथा छोटी फ़ाइलों के लिए इसका ओवरहेड भी अनुचित रूप से बड़ा है।

  2. धीमी संकलन गति। स्केलैक लगभग 500 तक 1000 लाइनों / सेकंड का प्रबंधन करता है। Javac लगभग 10 बार प्रबंधित करता है। इसके अनेक कारण हैं।

    • टाइप इंफ़ेक्शन महंगा है, विशेष रूप से अगर इसमें निहित खोज शामिल है।

    • स्केलैक को दो बार टाइप चेकिंग करनी है; एक बार स्काला के नियमों के अनुसार और दूसरी बार जावा के नियमों के अनुसार मिटाने के बाद।

    • प्रकार की जाँच के अलावा, स्काला से जावा तक जाने के लिए लगभग 15 परिवर्तन चरण हैं, जो सभी समय लेते हैं।

    • स्काला आमतौर पर जावा की तुलना में प्रति फ़ाइल आकार में कई और कक्षाएं उत्पन्न करता है, विशेष रूप से अगर कार्यात्मक मुहावरों का भारी उपयोग किया जाता है। बाइटकोड जेनरेशन और क्लास राइटिंग में समय लगता है।

    दूसरी ओर, एक 1000 लाइन स्काला प्रोग्राम 2-3K लाइन जावा प्रोग्राम के अनुरूप हो सकता है, इसलिए धीमी गति से कुछ की जब प्रति सेकंड लाइनों में गिना जाता है तो प्रति लाइन अधिक कार्यक्षमता के खिलाफ संतुलित होना पड़ता है।

    हम गति सुधार पर काम कर रहे हैं (उदाहरण के लिए समानांतर में वर्ग फ़ाइलों को उत्पन्न करके), लेकिन कोई इस मोर्चे पर चमत्कार की उम्मीद नहीं कर सकता है। स्लैक कभी भी जेवैक की तरह तेज नहीं होगा। मेरा मानना ​​है कि समाधान अच्छे निर्भरता विश्लेषण के साथ fsc जैसे संकलित सर्वरों में निहित होगा ताकि केवल फाइलों के न्यूनतम सेट को फिर से स्थापित किया जा सके। हम उस पर भी काम कर रहे हैं।


1
क्लास लोडिंग के कारण स्टार्टअप ओवरहेड के बारे में: जीसीजे या मोनो मदद का उपयोग करके देशी कोड के लिए आगे-आगे-समय संकलन होगा?
मैकेनिकल घोंघा

15
क्या होगा अगर स्काला C ++ में फिर से लिखा गया? : ओ)
मार्कस

क्या इनविटेड डायनामिक बायटेकोड अनुदेश का उपयोग करने का कोई लाभ होगा?
रोब ग्रांट

40

आपको पता होना चाहिए कि स्काला संकलन संकलन के लिए जावा की तुलना में कम से कम परिमाण का एक क्रम लेता है। इसके कारण इस प्रकार हैं:

  1. नामकरण सम्मेलनों (एक फ़ाइल XY.scalaफ़ाइल में एक क्लास नाम की आवश्यकता नहीं होती है XYऔर इसमें कई शीर्ष-स्तरीय कक्षाएं शामिल हो सकती हैं)। इसलिए कंपाइलर को किसी दिए गए वर्ग / विशेषता / वस्तु पहचानकर्ता को खोजने के लिए अधिक स्रोत फ़ाइलों को खोजना पड़ सकता है।
  2. इंप्लिसिट्स - इम्पीचिट्स के भारी उपयोग का मतलब है कि कंपाइलर को किसी दिए गए तरीके के लिए किसी इन-स्कोप इम्प्लांट रूपांतरण को खोजने और "सही" खोजने के लिए रैंक करना होगा। ( अर्थात एक विधि का पता लगाने पर कंपाइलर में बड़े पैमाने पर वृद्धि हुई खोज डोमेन होता है। )
  3. प्रकार प्रणाली - scala प्रकार प्रणाली जावा की तुलना में अधिक जटिल है और इसलिए अधिक CPU समय लगता है।
  4. टाइप इंफ़ेक्शन - टाइप इंफ़ेक्शन कम्प्यूटेशनल रूप से महंगा है और एक ऐसा काम है जिसे javacकरने की ज़रूरत नहीं है
  5. scalacGenICode संकलन चरण के दौरान मैजिक कुंजी संयोजन CTRL-ALT-F12 का उपयोग करके देखा जा सकता है, जिसमें एक पूरी तरह से सशस्त्र और परिचालन युद्ध स्टेशन का 8-बिट सिम्युलेटर शामिल है ।

3
@obox_lakes, nitpick करने के लिए नफरत है, लेकिन जावा करता पैरामिट्रीकृत तरीकों के लिए प्रकार निष्कर्ष करने की ज़रूरत int a<T>(T a) {}है और फिर a(pls_infer_my_type)james-iry.blogspot.com/2009/04/...
Elazar Leibovich

13
@ इज़ार - हाँ, मुझे पता है। लेकिन यह स्पष्ट रूप से हंसने योग्य है, स्केला के बगल में, इस "प्रकार की आक्षेप" को कहने के लिए!
oxbow_lakes 22:31 पर


19

Scala करने का सबसे अच्छा तरीका IDEA और SBT है। एक प्राथमिक SBT प्रोजेक्ट सेट करें (जो आपके लिए अच्छा होगा, यदि आप चाहें तो) और इसे स्वचालित संकलित मोड (कमांड ~compile) में चलाएं और जब आप अपनी परियोजना को बचाएंगे, तो SBT इसे पुनः स्थापित कर देगा।

आप आईडीईए के लिए एसबीटी प्लग-इन का भी उपयोग कर सकते हैं और अपने प्रत्येक रन कॉन्फ़िगरेशन में एक एसबीटी कार्रवाई संलग्न कर सकते हैं। SBT प्लग-इन आपको IDEA के भीतर एक इंटरैक्टिव SBT कंसोल भी देता है।

किसी भी तरह (एसबीटी बाहरी या एसबीटी प्लग-इन चल रहा है), एसबीटी चलता रहता है और इस तरह आपकी परियोजना के निर्माण में इस्तेमाल होने वाले सभी वर्गों को "वार्म अप" और जेआईटी-एड और स्टार्ट-अप ओवरहेड समाप्त हो जाता है। इसके अतिरिक्त, एसबीटी केवल स्रोत फ़ाइलों को संकलित करता है जिन्हें इसकी आवश्यकता होती है। यह स्काला प्रोग्राम बनाने का अब तक का सबसे कारगर तरीका है।


9

स्काला-आईडीई (ग्रहण) के नवीनतम संशोधन वृद्धिशील संकलन का बेहतर प्रदर्शन कर रहे हैं।

अधिक के लिए " सबसे अच्छा स्काला बिल्ड सिस्टम क्या है? " देखें।


अन्य उपाय fsc - स्कैला 2 भाषा के लिए फास्ट ऑफलाइन कंपाइलर को एकीकृत करना है - (इस ब्लॉग पोस्ट में सचित्र ) आपके IDE में एक बिल्डर के रूप में।

वैकल्पिक शब्द

लेकिन सीधे ग्रहण में नहीं , हालांकि, डैनियल स्पाइवाक ने टिप्पणियों में उल्लेख किया है:

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


अंत में, जैक्सन डेविस ने मुझे टिप्पणियों में याद दिलाया:

sbt (सिम्पल बिल्ड टूल) में कुछ प्रकार के "वृद्धिशील" संकलन ( ट्रिगर निष्पादन के माध्यम से ) शामिल हैं, भले ही यह सही नहीं है , और वर्धित वृद्धिशील संकलन आगामी 0.9 sbt संस्करण के लिए काम में है।


2
sbt वृद्धिशील संकलन भी कर सकते हैं
जैक्सन डेविस

@ जैकसन: ट्रिगर निष्पादन, सही! मैंने इसे अपने उत्तर में शामिल किया है।
VonC

2
आपको सीधे ग्रहण के भीतर एफएससी का उपयोग नहीं करना चाहिए, यदि केवल इसलिए कि ग्रहण पहले से ही सतह के नीचे एफएससी का उपयोग कर रहा है। एफएससी मूल रूप से निवासी कंपाइलर के ऊपर एक पतली परत होती है जो स्केल प्रोजेक्ट्स को संकलित करने के लिए एक्लिप्स द्वारा उपयोग किए जाने वाले तंत्र का सटीक रूप से उपयोग करती है।
डैनियल स्पिवक

1
एफएससी का मतलब फास्ट स्काला कंपाइलर है - फास्ट जावा कंपाइलर नहीं
बेन मैककैन

@BenMcCann: उफ़। सही। मैंने जवाब तय कर दिया है।
वॉन

6

Fsc का उपयोग करें - यह एक तेज़ स्कैला संकलक है जो एक पृष्ठभूमि कार्य के रूप में बैठता है और इसे हर समय लोड करने की आवश्यकता नहीं होती है। यह पिछले संकलक उदाहरण का पुन: उपयोग कर सकता है।

मुझे यकीन नहीं है कि अगर नेटबैंस स्कैला प्लगइन fsc (प्रलेखन ऐसा कहता है) का समर्थन करता है, लेकिन मैं इसे काम नहीं कर सका। रात में प्लगइन के निर्माण की कोशिश करो।


1
IntelliJ IDEA Scala प्लगइन में fsc का उपयोग करने का एक विकल्प भी है
आरोन नोवस्त्रुप

1
@anovstrup: हाँ, लेकिन यह कभी-कभी दुर्घटनाग्रस्त हो जाता है।
डेनिस तुलस्किए

4

आप JRebel प्लगइन का उपयोग कर सकते हैं जो Scala के लिए मुफ़्त है। इसलिए आप "डिबगर में विकास" कर सकते हैं और जेब्रेल हमेशा मौके पर बदले हुए वर्ग को फिर से लोड करेंगे।

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

अगर यह 100% स्काला नहीं है, लेकिन यह भी कुछ इसी तरह की है, तो आप कोटलिन को एक कोशिश दे सकते हैं ।

- ओलिवर


2

मुझे यकीन है कि यह नीचे-मतदान होगा, लेकिन गुणवत्ता या उत्पादकता के लिए अत्यंत तीव्र मोड़ हमेशा अनुकूल नहीं होता है।

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

संक्षेप में: स्काला के लिए बेहतर अनुकूलतम कार्य पद्धति की तलाश करें।


3
मैं मानता हूं कि तीव्र गति से चक्कर लगाना जरूरी नहीं है। लेकिन यह चोट नहीं करता है, यह करता है?
एलाजार लीबोविच

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

9
मुझे लगता है कि दौड़ने से पहले मेरी अधिकांश उत्पादकता वास्तव में सोच से अधिक खो गई है। मैं अक्सर खुद को लंबे समय तक कुछ समीकरणों को देखने के लिए देखता हूं, जो कभी भी संभावित संभावित नुकसान के लिए इंतजार कर रहा होता है, मैं सोच रहा था, "बस इसे चलाएं!" मेरे सिर के पीछे। और निश्चित रूप से पर्याप्त है, जब मैं कार्यक्रम चलाता हूं तो मैं बहुत अधिक सीखता हूं जो संभवतः एक और घंटे या दो ध्यान के साथ होगा। ध्यान अच्छा है, लेकिन मुझे लगता है कि मैंने जावा के साथ वृद्धिशील संकलन / ध्यान का बहुत इष्टतम उपयोग किया था।
user405163

2
यह भी सुझाव देने के समान है कि शेक्सपियर को वर्तनी-परीक्षक का उपयोग नहीं करना चाहिए, और इसके बजाय वह जो कहना चाहता है, उसके बारे में कठिन सोचें। स्वचालित वर्तनी-परीक्षक समस्याओं के एक पूरी तरह से अलग सेट के साथ मदद करता है।
थिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.