मैं gwt संकलक को कैसे गति दूं?


201

हम अपनी परियोजनाओं में GWT का भारी उपयोग करना शुरू कर रहे हैं, और GWT संकलक का प्रदर्शन लगातार कष्टप्रद होता जा रहा है।

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

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

हम वर्तमान में com.google.gwt.dev.Compiler को एंटी एंट लक्ष्य से जावा एप्लिकेशन के रूप में, 256 मीटर अधिकतम ढेर और ढेर सारी जगह के साथ लगा रहे हैं। कंपाइलर चींटी द्वारा कांटा = सच और नवीनतम Java 6 JRE का उपयोग करके लॉन्च किया गया है, ताकि Java6 के बेहतर प्रदर्शन का लाभ उठाया जा सके। हम अपने मुख्य नियंत्रक वर्ग को एप्लिकेशन क्लासपाथ के साथ कंपाइलर के पास भेजते हैं, और बंद हो जाता है।

कुछ अतिरिक्त गति पाने के लिए हम और क्या कर सकते हैं? क्या हम इसे अधिक जानकारी दे सकते हैं ताकि यह कम समय बिताए कि क्या करना है?

मुझे पता है कि हम इसे केवल एक ब्राउज़र के लिए संकलन करने के लिए कह सकते हैं, लेकिन हमें मल्टी-ब्राउज़र परीक्षण करने की आवश्यकता है, इसलिए यह वास्तव में व्यावहारिक नहीं है।

इस बिंदु पर सभी सुझावों का स्वागत है।

जवाबों:


144

आइए असहज सत्य से शुरू करें: GWT संकलक प्रदर्शन वास्तव में घटिया है। आप यहां और वहां कुछ हैक्स का उपयोग कर सकते हैं, लेकिन आपको बेहतर प्रदर्शन नहीं मिलेगा।

एक अच्छा प्रदर्शन हैक जो आप कर सकते हैं वह केवल विशिष्ट ब्राउज़रों के लिए संकलन करने के लिए है, आपके द्वारा निम्न पंक्ति सम्मिलित करके gwt.xml:

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

या gwt में 2.x सिंटैक्स, और केवल एक ब्राउज़र के लिए:

<set-property name="user.agent" value="gecko1_8"/>

यह, उदाहरण के लिए, केवल IE और FF के लिए आपके आवेदन को संकलित करेगा। यदि आप जानते हैं कि आप परीक्षण के लिए केवल एक विशिष्ट ब्राउज़र का उपयोग कर रहे हैं, तो आप इस छोटे हैक का उपयोग कर सकते हैं।

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

नीचे पंक्ति: आप संकलक के प्रदर्शन में क्रम-वृद्धि को प्राप्त नहीं करने जा रहे हैं, लेकिन कई आराम ले रहे हैं, आप यहां और वहां कुछ ही मिनटों में दाढ़ी बना सकते हैं।


3
यह GWT 2.0 के लिए प्रकट होता है, आप वास्तव में एक उपयोगकर्ता एजेंट को निर्दिष्ट करने के लिए इस सिंटैक्स चाहते हैं: <set-property name = "user.agent" मान = "gecko, gecko1_8" />
mooreds

Gwt 2.2 में जेको नहीं है। कंपाइलर कहता है कि "मूल्य जेको को पहले से परिभाषित नहीं किया गया था। अप्रत्याशित तत्व 'सेट-प्रॉपर्टी' को संसाधित करते समय"
utrak

"gecko1_8" के लिए मान सेट करना चाहिए केवल फ़ायरफ़ॉक्स 1.5 के लिए काम करना चाहिए और बाद में gwt 2.2 में
eaykin

यह उत्तर लगभग दो साल पुराना है। इस बिंदु को स्पष्ट करने के लिए इसे संपादित करने के लिए स्वतंत्र महसूस करें।
युवल एडम

6
2013, अभी भी GWT संकलित समय बेकार है, क्या कोई भी इस उत्तर के लिए सुधार कर सकता है, GWT 2.5
Forhad

62

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

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


2
आह, लोकलवेयर विकल्प एक रत्न है, जो जानने योग्य है। अफसोस की बात है, हमारे अधिकांश देव बॉक्स सिंगल-कोर एक्सॉन हैं। वह OOPHM बहुत ही आशाजनक लग रहा है। हमेशा अगले संस्करण में, यह है ...
स्केफमैन

4
एक बॉक्स पर कई कोर के साथ एक संकलन वातावरण को वर्चुअलाइज करें; इस vm में रिमोट; कम से कम स्थानीय लोगों और user.agents के साथ -localWorkers का उपयोग करके कमांड लाइन GWT संकलित करें; सुनिश्चित करें कि vm की मेजबानी करने वाला बॉक्स एक नेटवर्क सहकर्मी है जहाँ आप तैनात हैं। इसका संयोजन आपके संकलित को लगभग 30 सेकंड w / में तैनात करता है। इसके अलावा यह सब एक स्क्रिप्ट में लिखा जा सकता है। आप एक स्थानीय मशीन पर भी काम कर सकते हैं, एक svn पैच बना सकते हैं, और अपनी स्क्रिप्ट को किसी प्रकार के NFS या सांबा साझाकरण का उपयोग करके पैच लागू कर सकते हैं, बस src diffs पर कॉपी करने की आवश्यकता को समाप्त कर सकते हैं। वाह!
क्र।

NX क्लाइंट भी सीमित ADSL, केबल या वाईफाई कनेक्शन पर दूरस्थ देव के लिए एक विशाल +++ है। इसके अलावा आप हमेशा कोई बात नहीं क्या कंप्यूटर अनुप्रयोग आप किसी भी स्थान w / इंटरनेट पर प्रयोग कर रहे हैं सिंक में हैं
kr।

मावेन बिल्ड में सीपीयू की प्लेटफॉर्म उपलब्ध संख्या के लिए चूक। इसलिए मेरे लिए यहां कोई गति नहीं।
कीकी

55

यद्यपि यह प्रविष्टि काफी पुरानी है और आप में से अधिकांश शायद पहले से ही जानते हैं, मुझे लगता है कि यह ध्यान देने योग्य है कि GWT 2.x में एक नया संकलन ध्वज शामिल है जो अनुकूलन को छोड़ कर संकलन को गति देता है। आप निश्चित रूप से जावास्क्रिप्ट को इस तरह से संकलित नहीं करना चाहिए, लेकिन यह गैर-उत्पादन निरंतर निर्माण के दौरान एक समय बचाने वाला हो सकता है।

बस ध्वज शामिल करें: -DraftCompile अपने GWT संकलक लाइन पर।


3
मैंने उस विकल्प का उपयोग किया, और हमारी परियोजना में कभी-कभी यह एक अजीब त्रुटि के साथ विफल हो गया। इसलिए जागरूक रहें, क्योंकि कभी-कभी संकलन इस वजह से काम नहीं कर सकता है।
विक

31

यहां user.agent मानों की एक सूची दी गई है, जिन्हें आप इसे सेट कर सकते हैं।

(यह यहाँ जोड़ा जा रहा है क्योंकि मैं यहाँ समाप्त जब मैं क्या मैं इसे केवल क्रोम के लिए एक परिवर्तन का उत्पादन करने के लिए स्थापित करना चाहिए के लिए खोज रख जवाब है:। <set-property name="user.agent" value="safari"/>)


मुझे इस सेट-प्रॉपर्टी तत्व को कहां जोड़ना है? मैंने अपने app.gwt.xml फ़ाइल में <मॉड्यूल> तत्व के अंदर और बाहर इसे जोड़ने की कोशिश की है और यह काम नहीं करता है।
एलेक्स वर्डेन

यह आपके मॉड्यूल ABC.gwt.xml फ़ाइल में जाता है जहाँ ABC आपके मॉड्यूल का नाम है।
ग्लेन

30

GWT के नए संस्करणों में (या तो 2.3 या 2.4 से शुरू, मुझे विश्वास है), आप भी जोड़ सकते हैं

<collapse-all-properties />

विकास के उद्देश्यों के लिए अपने gwt.xml के लिए। यह GWT संकलक को एक एकल क्रमचय बनाने के लिए कहेगा जो सभी स्थानों और ब्राउज़रों को कवर करता है। इसलिए, आप अभी भी सभी ब्राउज़रों और भाषाओं में परीक्षण कर सकते हैं, लेकिन फिर भी केवल एक ही क्रमांकन का संकलन कर रहे हैं


2
दिलचस्प है ... नकारात्मक पक्ष क्या है?
स्केफमैन

एक एकल क्रमांकन को संकलित करना जो सभी ब्राउज़रों और भाषाओं को संभालता है फिर भी एक एकल क्रमांकन की तुलना में थोड़ा अधिक समय लेता है जो केवल एक ब्राउज़र और भाषा को संभालता है, लेकिन मेरे अनुभव में अंतर महत्वपूर्ण नहीं है। (~ 25% अधिक वही है जो मैं देख रहा हूं, लेकिन यह अभी भी कई क्रमों को संकलित करने पर बहुत बड़ा सुधार है)
Chi

मुझे इसके लिए डॉक लिंक नहीं मिल रहा है ... क्या आप किसी चीज़ से लिंक कर सकते हैं?
स्केफमैन

हालाँकि यह टैग संकलन को गति देता है, यह सुपर देव मोड (कम से कम 2.6 के लिए) में डिबगिंग को भी तोड़ता है। क्रोम डीबगर में दिखाया गया सोर्स कोड संकलित js कोड से अलग होता है। इसलिए जब मैंने कुछ जावा विधि में एक ब्रेकपॉइंट लगाया, तो डिबगर दूसरी विधि में बंद हो गया।
दमलूार

18

आप उत्पादन के लिए अपने निर्माण में एक विकल्प जोड़ सकते हैं:

-localWorkers 8- जहां 8 समवर्ती धागों की संख्या है जो क्रमपरिवर्तन की गणना करते हैं। आपको बस इस संख्या को उस संख्या से समायोजित करना है जो आपके लिए अधिक सुविधाजनक है। GWT संकलन प्रदर्शन देखें ( डेनिस इच टिप्पणी के लिए धन्यवाद)।

यदि आप परीक्षण वातावरण के लिए संकलित कर रहे हैं, तो आप भी उपयोग कर सकते हैं:

-draftCompile जो तेजी से, लेकिन कम-अनुकूलित संकलन को सक्षम बनाता है

-optimize 0 जो आपके कोड का अनुकूलन नहीं करता है (9 अधिकतम अनुकूलन मूल्य है)

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

आशा है कि यह आपकी मदद करता है!


स्थानीय श्रमिकों को कोर की संख्या में सेट करना बहुत अनुत्पादक हो सकता है। संदर्भ के लिए इसे देखें: josephmarques.wordpress.com/2010/07/30/…
डेनिस इश

डेनिस टिप्पणी करने के लिए धन्यवाद। दरअसल, मेरे पास एक एसएसडी है और 2G मेमोरी देता है। बेशक कि क्रमपरिवर्तन, कोर, मशीन, आदि की संख्या के आधार पर, लोकलवॉकर की संख्या को प्रत्येक मामले में शामिल किया जाना चाहिए ... मेरे मामले में, जब मैं अपने लैपटॉप पर संकलन कर रहा हूं और वेब पर नेविगेट करना चाहता हूं, यदि 2 कोर मुक्त छोड़ दें। वह सिर्फ एक उदाहरण है। हालाँकि, अपने विचार को शामिल करने के लिए मेरी पोस्ट को संपादित करेंगे। धन्यवाद।
Martins.tuga

14

GWT कंपाइलर बहुत सारे कोड विश्लेषण कर रहा है इसलिए इसे गति देना मुश्किल हो रहा है। Google IO 2008 का यह सत्र आपको एक अच्छा विचार देगा कि GWT क्या कर रहा है और इसमें इतना समय क्यों लगता है।

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

आप GWT संकलन को गति दे सकते हैं लेकिन केवल कुछ ब्राउज़रों के लिए संकलन कर रहे हैं, बजाय 5 प्रकार के जो डिफ़ॉल्ट रूप से GWT करता है। यदि आप होस्टेड मोड का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आप कम से कम दो ब्राउज़रों के लिए संकलन करते हैं; यदि आप किसी एकल ब्राउजर के लिए संकलन करते हैं तो ब्राउजर डिटेक्शन कोड को ऑप्टिमाइज़ किया जाता है और फिर होस्टेड मोड कोई और काम नहीं करता है।

कम ब्राउज़रों के लिए संकलन कॉन्फ़िगर करने का एक आसान तरीका एक दूसरा मॉड्यूल बनाना है जो आपके मुख्य मॉड्यूल से विरासत में मिलता है:

<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
  <!-- If you compile for only one browser, the browser detection javascript
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

यदि rename-toविशेषता समान है, तो आउटपुट फ़ाइलें समान होंगी जैसे कि आपने पूर्ण संकलन किया था


11
  • अपने एप्लिकेशन को कई मोड्यूल या एंट्री पॉइंट्स में विभाजित करें और फिर जरूरत पड़ने पर ही पुन: संकलित करें।
  • ट्रंक संस्करण का उपयोग करके अपने आवेदन का विश्लेषण करें - जो आपके संकलन की कहानी प्रदान करता है । यह 1.6 संकलक के लिए प्रासंगिक हो सकता है या नहीं भी हो सकता है लेकिन यह संकेत दे सकता है कि क्या हो रहा है।

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

4

GWT 2.x के लिए मैंने अभी पता लगाया है कि यदि आप उपयोग करते हैं

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

आप एक से अधिक क्रमपरिवर्तन भी निर्दिष्ट कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.