ฉันจะเร่งความเร็ว gwt คอมไพเลอร์ได้อย่างไร


201

เราเริ่มใช้ GWT หนักกว่าในโครงการของเราและประสิทธิภาพของคอมไพเลอร์ GWT เริ่มน่ารำคาญมากขึ้นเรื่อย ๆ

เรากำลังจะเริ่มปรับเปลี่ยนวิธีการทำงานของเราเพื่อลดปัญหารวมถึงการเน้นที่เบราว์เซอร์โหมดโฮสต์ซึ่งยิ่งเพิ่มความจำเป็นในการเรียกใช้คอมไพเลอร์ GWT จนกระทั่งในเวลาต่อมา แต่นำความเสี่ยงของตัวเองโดยเฉพาะ ไม่จับปัญหากับเบราว์เซอร์ที่แท้จริงจนกว่าจะช้ากว่าที่เราต้องการ

ตามหลักการแล้วเราต้องการทำให้ GWT คอมไพเลอร์ตัวเองเร็วขึ้น - นาทีในการรวบรวมแอปพลิเคชั่นที่ค่อนข้างเล็กคือการถ่ายปัสสาวะ อย่างไรก็ตามเรากำลังใช้การคอมไพล์ถ้าเป็นแฟชั่นที่ไร้เดียงสาดังนั้นฉันหวังว่าเราจะได้รับผลตอบแทนที่รวดเร็วและง่ายดาย

ขณะนี้เรากำลังเรียกใช้ com.google.gwt.dev.Compiler เป็นแอปพลิเคชัน java จากเป้าหมาย Ant Ant โดยมีฮีปสูงสุด 256m และพื้นที่สแต็กจำนวนมาก คอมไพเลอร์เปิดตัวโดย Ant ใช้ fork = true และ 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 เท่านั้น หากคุณรู้ว่าคุณกำลังใช้เบราว์เซอร์เฉพาะสำหรับการทดสอบคุณสามารถใช้แฮ็คเล็ก ๆ นี้ได้

ตัวเลือกอื่น: หากคุณใช้หลายภาษาและใช้เพียงครั้งเดียวในการทดสอบคุณสามารถใส่ความคิดเห็นทั้งหมดเพื่อให้ GWT จะใช้สถานที่เริ่มต้นซึ่งจะเป็นการลดค่าใช้จ่ายเพิ่มเติมจากเวลารวบรวม

ที่บรรทัดด้านล่าง: คุณจะไม่ได้รับการเพิ่มขึ้นของขนาดคอมไพเลอร์ แต่เพิ่มการผ่อนคลายหลายอย่างคุณสามารถโกนทิ้งได้ไม่กี่นาทีที่นี่และที่นั่น


3
มันจะปรากฏขึ้นสำหรับ GWT 2.0 คุณต้องการให้ไวยากรณ์นี้เพื่อระบุตัวแทนผู้ใช้: <set-property name = "user.agent" value = "gecko, gecko1_8" />
แขก

ใน gwt 2.2 ไม่มีตุ๊กแก คอมไพเลอร์ระบุว่า "ไม่ได้กำหนดค่าตุ๊กแกก่อนหน้านี้เกิดข้อยกเว้นที่ไม่คาดคิดขณะประมวลผล 'set-property'"
uthark

การตั้งค่าเป็น "gecko1_8" ควรทำงานกับ Firefox 1.5 และใหม่กว่าใน gwt 2.2
eaykin

คำตอบนี้มีอายุเกือบสองปี อย่าลังเลที่จะแก้ไขเพื่อชี้แจงจุดนี้
Yuval Adam

6
2013, เวลารวบรวม GWT ยังคงแย่ ๆ ที่ใคร ๆ ก็สามารถปรับปรุงคำตอบนี้ได้, GWT 2.5
Forhad

62

หากคุณเรียกใช้คอมไพเลอร์ GWT ด้วยแฟล็ก -localWorkers คอมไพเลอร์จะรวบรวมการเรียงสับเปลี่ยนหลายขนาน สิ่งนี้ช่วยให้คุณใช้แกนประมวลผลทั้งหมดของเครื่องมัลติคอร์ตัวอย่างเช่น -localWorkers 2 จะบอกให้คอมไพเลอร์ทำการคอมไพล์สองพีชคณิตแบบขนาน คุณจะไม่ได้รับลำดับความแตกต่างของขนาด (ไม่ใช่ทุกอย่างในคอมไพเลอร์เป็นแบบคู่ขนาน) แต่มันก็ยังเป็นความเร็วที่น่าสังเกตถ้าคุณกำลังรวบรวมการเรียงสับเปลี่ยนหลายครั้ง

หากคุณยินดีที่จะใช้รุ่น trunk ของ GWT คุณจะสามารถใช้โหมดโฮสต์สำหรับเบราว์เซอร์ใด ๆ ( ออกจากโหมดโฮสต์ที่ดำเนินการอยู่ ) ซึ่งจะช่วยลดปัญหาส่วนใหญ่ในปัจจุบันในโหมดโฮสต์ ดูเหมือนว่าจะเป็นที่ที่ GWT กำลังพัฒนาอยู่เสมอด้วยโหมดโฮสต์เนื่องจากการรวบรวมไม่น่าจะทำให้ขนาดเร็วขึ้น


2
Ah, ตัวเลือก localWorkers เป็นอัญมณีที่ควรค่าแก่การรู้ น่าเศร้าที่กล่อง dev ของเราส่วนใหญ่เป็น xeons แบบแกนเดียว OOPHM นั้นดูมีแนวโน้มมากเช่นกัน เสมอในรุ่นถัดไปก็คือ ...
skaffman

4
จำลองสภาพแวดล้อมการคอมไพล์บนกล่องที่มีหลายคอร์ รีโมตลงใน vm นี้ ดำเนินการบรรทัดคำสั่ง GWT คอมไพล์โดยใช้ -localWorkers โดยมี locals และ user.agents น้อยที่สุด ตรวจสอบให้แน่ใจว่ากล่องที่โฮสต์ vm เป็นเครือข่ายเพียร์ที่คุณกำลังปรับใช้ การรวมกันของสิ่งนี้จะทำให้คอมไพล์ของคุณลดลงเหลือประมาณ 30 วินาทีโดยมีการปรับใช้ในทอมแคท นอกจากนี้ทั้งหมดนี้สามารถเขียนเป็นสคริปต์ คุณยังสามารถพัฒนาบนเครื่องโลคัลสร้างแพตช์ svn และให้สคริปต์ของคุณใช้แพตช์โดยใช้การแชร์ NFS หรือแซมบ้าบางประเภทโดยไม่จำเป็นต้องคัดลอกเฉพาะ src diffs เย้!
kr

ไคลเอนต์ NX ยังเป็น +++ ขนาดใหญ่สำหรับการพัฒนาจากระยะไกลในการเชื่อมต่อ ADSL, เคเบิลหรือ WiFi ที่ จำกัด นอกจากนี้คุณยังซิงค์อยู่เสมอไม่ว่าคุณจะใช้คอมพ์ใดในสถานที่ใด ๆ ที่มีอินเทอร์เน็ต
kr

ค่าดีฟอลต์คือจำนวน CPU ที่มีในแพล็ตฟอร์มที่มีอยู่ใน maven build ดังนั้นไม่ต้องเร่งความเร็วที่นี่สำหรับฉัน
keiki

55

แม้ว่ารายการนี้จะค่อนข้างเก่าและส่วนใหญ่คุณอาจรู้อยู่แล้วฉันคิดว่ามันคุ้มค่าที่จะพูดถึงว่า GWT 2.x มีการรวบรวมธงใหม่ซึ่งเพิ่มความเร็วในการรวบรวมโดยการข้ามการปรับให้เหมาะสม แน่นอนว่าคุณไม่ควรปรับใช้ JavaScript ที่คอมไพล์ด้วยวิธีนี้ แต่อาจเป็นการประหยัดเวลาในระหว่างการสร้างที่ไม่ใช่การผลิตอย่างต่อเนื่อง

เพียงรวมแฟล็ก: -draftCompile ไปยังบรรทัดคอมไพเลอร์ GWT ของคุณ


3
ฉันใช้ตัวเลือกนั้นและในโครงการของเราบางครั้งมันก็ล้มเหลวด้วยข้อผิดพลาดแปลก ๆ ดังนั้นโปรดทราบว่าบางครั้งการรวบรวมอาจใช้งานไม่ได้เนื่องจากสิ่งนี้
วิ

31

นี่คือรายการของค่า user.agent ที่คุณสามารถตั้งค่าเป็น

(การเพิ่มที่นี่เพราะผมให้ตายขึ้นที่นี่เมื่อฉันค้นหาสิ่งที่ฉันควรตั้งที่จะทำให้มันเพียง แต่ผลิตการเปลี่ยนแปลงสำหรับโครเมี่ยมคำตอบคือ. <set-property name="user.agent" value="safari"/>)


ฉันควรจะเพิ่มองค์ประกอบชุดคุณสมบัตินี้ที่ไหน ฉันได้ลองเพิ่มเข้าไปทั้งด้านในและด้านนอกขององค์ประกอบ <module> ในไฟล์ app.gwt.xml แล้ว แต่มันไม่ทำงาน
อเล็กซ์ Worden

มันจะไปในไฟล์โมดูล ABC.gwt.xml ของคุณโดยที่ ABC คือชื่อโมดูลของคุณ
เกล็น

30

ในรุ่นที่ใหม่กว่าของ GWT (เริ่มจาก 2.3 หรือ 2.4 ฉันเชื่อว่า) คุณยังสามารถเพิ่มได้

<collapse-all-properties />

ไปที่ gwt.xml ของคุณเพื่อการพัฒนา ที่จะบอกคอมไพเลอร์ GWT เพื่อสร้างการเรียงสับเปลี่ยนครั้งเดียวซึ่งครอบคลุมโลแคลและเบราว์เซอร์ทั้งหมด ดังนั้นคุณยังสามารถทดสอบในเบราว์เซอร์และภาษาทั้งหมด แต่ยังคงรวบรวมเพียงการเรียงสับเปลี่ยนเดียว


2
ที่น่าสนใจ ... ข้อเสียคืออะไร
skaffman

การรวบรวมการเปลี่ยนแปลงครั้งเดียวที่จัดการกับเบราว์เซอร์และภาษาทั้งหมดยังคงใช้เวลานานกว่าการเปลี่ยนแปลงเพียงครั้งเดียวที่จัดการเพียงหนึ่งเบราว์เซอร์และภาษาเท่านั้น แต่ความแตกต่างนั้นไม่มีนัยสำคัญในประสบการณ์ของฉัน (~ 25% มากขึ้นคือสิ่งที่ฉันเห็น แต่ที่ยังคงปรับปรุงใหญ่กว่ารวบรวมพีชคณิตหลาย)
จิ

ฉันหาลิงค์หมอสำหรับเรื่องนี้ไม่ได้ ...
skaffman

แม้ว่าแท็กนี้จะเพิ่มความเร็วในการรวบรวม แต่ก็ยังแยกการดีบักในโหมด Super Dev (อย่างน้อย 2.6) ซอร์สโค้ดที่แสดงในดีบักเกอร์ chrome แตกต่างจากโค้ด js ที่คอมไพล์แล้ว ดังนั้นเมื่อฉันใส่เบรกพอยต์ในวิธีการจาวาบางตัวดีบักเกอร์หยุดในวิธีอื่น
damluar

18

คุณสามารถเพิ่มหนึ่งตัวเลือกในงานสร้างของคุณ:

-localWorkers 8- ที่ 8 คือจำนวนของเธรดพร้อมกันที่คำนวณการเรียงสับเปลี่ยน สิ่งที่คุณต้องทำคือการปรับหมายเลขนี้เป็นหมายเลขที่คุณสะดวกกว่า ดูประสิทธิภาพการรวบรวม GWT (ขอบคุณความคิดเห็น Dennis Ich)

หากคุณกำลังรวบรวมสภาพแวดล้อมการทดสอบคุณสามารถใช้:

-draftCompile ซึ่งช่วยให้การรวบรวมเร็วขึ้น แต่มีประสิทธิภาพน้อยกว่า

-optimize 0 ซึ่งไม่ได้เพิ่มประสิทธิภาพรหัสของคุณ (9 คือค่าการเพิ่มประสิทธิภาพสูงสุด)

อีกสิ่งที่ประสิทธิภาพการสร้างและโฮสต์โหมดเพิ่มขึ้นกว่าเท่าตัวคือการใช้ดิสก์ SSD (ตอนนี้โฮสต์โหมดทำงานได้เหมือนเครื่องราง) มันไม่ใช่วิธีแก้ปัญหาที่ถูก แต่ขึ้นอยู่กับว่าคุณใช้ GWT มากแค่ไหนและค่าใช้จ่ายในเวลาของคุณมันอาจคุ้มค่า!

หวังว่านี่จะช่วยคุณได้!


การตั้งค่าคนงานในท้องถิ่นเป็นจำนวนของคอร์อาจไม่ได้ผลมากนัก ดูสิ่งนี้สำหรับการอ้างอิง: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich

ขอบคุณสำหรับความคิดเห็นของคุณเดนนิส จริงๆแล้วฉันมี SSD และให้หน่วยความจำ 2G แน่นอนว่าต้องปรับจำนวน localWorker ในแต่ละกรณีขึ้นอยู่กับจำนวนการเรียงสับเปลี่ยนแกนเครื่อง ฯลฯ ... ในกรณีของฉันเมื่อฉันรวบรวมแล็ปท็อปของฉันและต้องการนำทางบนเว็บถ้า ปล่อยให้ 2 แกนฟรี นั่นเป็นเพียงตัวอย่าง อย่างไรก็ตามจะแก้ไขโพสต์ของฉันเพื่อรวมความคิดของคุณ ขอบคุณ
martins.tuga

14

คอมไพเลอร์ GWT กำลังทำการวิเคราะห์โค้ดจำนวนมากดังนั้นจึงเป็นการยากที่จะเพิ่มความเร็ว เซสชันนี้จาก Google IO 2008จะทำให้คุณมีความคิดที่ดีว่า GWT กำลังทำอะไรและเหตุใดจึงใช้เวลานาน

คำแนะนำของฉันสำหรับการพัฒนาใช้โหมดโฮสต์มากที่สุดแล้วรวบรวมเมื่อคุณต้องการทำการทดสอบเท่านั้น สิ่งนี้ฟังดูเหมือนโซลูชันที่คุณได้เข้ามาแล้ว แต่โดยทั่วไปนั่นเป็นสาเหตุที่โหมด Hosted อยู่ที่นั่น (นั่นคือและการดีบัก)

คุณสามารถเร่งความเร็วในการรวบรวม 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"/>

คุณสามารถระบุได้มากกว่าหนึ่งการเปลี่ยนแปลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.