Làm cách nào để tăng tốc trình biên dịch gwt?


201

Chúng tôi đang bắt đầu sử dụng GWT nặng hơn trong các dự án của mình và hiệu suất của trình biên dịch GWT ngày càng trở nên khó chịu.

Chúng tôi sẽ bắt đầu thay đổi các thực tiễn làm việc của mình để giảm thiểu vấn đề, bao gồm sự nhấn mạnh hơn vào trình duyệt chế độ được lưu trữ, điều này làm trì hoãn nhu cầu chạy trình biên dịch GWT cho đến sau này, nhưng điều đó mang lại rủi ro riêng, đặc biệt là không bắt gặp sự cố với trình duyệt thực cho đến muộn hơn chúng ta muốn.

Lý tưởng nhất, chúng tôi muốn làm cho trình biên dịch GWT nhanh hơn - một phút để biên dịch một ứng dụng khá nhỏ đang gây khó chịu. Tuy nhiên, chúng tôi đang sử dụng trình biên dịch nếu thời trang khá ngây thơ, vì vậy tôi hy vọng chúng tôi có thể kiếm được một số lợi nhuận nhanh chóng và dễ dàng.

Chúng tôi hiện đang gọi com.google.gwt.dev.Compiler là một ứng dụng java từ mục tiêu Ant, với heap tối đa 256m và nhiều không gian ngăn xếp. Trình biên dịch được Ant khởi chạy bằng cách sử dụng fork = true và JRE Java 6 mới nhất, để thử và tận dụng hiệu năng được cải thiện của Java6. Chúng ta chuyển lớp trình điều khiển chính của mình cho trình biên dịch cùng với đường dẫn ứng dụng và tắt nó đi.

Chúng ta có thể làm gì khác để có thêm tốc độ? Chúng tôi có thể cung cấp cho nó nhiều thông tin hơn để nó dành ít thời gian hơn để khám phá những việc cần làm không?

Tôi biết chúng ta có thể bảo nó chỉ biên dịch cho một trình duyệt, nhưng chúng ta cần thực hiện kiểm tra đa trình duyệt, vì vậy điều đó không thực tế.

Tất cả các đề xuất đều được chào đón tại thời điểm này.

Câu trả lời:


144

Hãy bắt đầu với một sự thật khó chịu: hiệu suất của trình biên dịch GWT thực sự tệ hại. Bạn có thể sử dụng một số hack ở đây và đó, nhưng bạn sẽ không có được hiệu suất tốt hơn đáng kể.

Một hack hiệu suất tốt mà bạn có thể làm là chỉ biên dịch cho các trình duyệt cụ thể, bằng cách chèn dòng sau vào gwt.xml:

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

hoặc theo cú pháp gwt 2.x và chỉ cho một trình duyệt:

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

Điều này, ví dụ, sẽ biên dịch ứng dụng của bạn cho IE và FF. Nếu bạn biết bạn chỉ đang sử dụng một trình duyệt cụ thể để thử nghiệm, bạn có thể sử dụng bản hack nhỏ này.

Một tùy chọn khác: nếu bạn đang sử dụng một số ngôn ngữ và một lần nữa chỉ sử dụng một địa điểm để thử nghiệm, bạn có thể nhận xét tất cả chúng để GWT sẽ sử dụng ngôn ngữ mặc định, điều này sẽ loại bỏ một số chi phí bổ sung từ thời gian biên dịch.

Điểm mấu chốt: bạn sẽ không tăng hiệu suất của trình biên dịch, nhưng thực hiện vài lần thư giãn, bạn có thể tắt một vài phút ở đây và ở đó.


3
Nó xuất hiện cho GWT 2.0, bạn thực sự muốn cú pháp này chỉ định tác nhân người dùng: <set-property name = "user.agent" value = "gecko, gecko1_8" />
neo đậu

Trong gwt 2.2 không có con tắc kè. Trình biên dịch nói rằng "Tắc kè giá trị không được xác định trước đây. Ngoại lệ không mong muốn trong khi xử lý phần tử 'set-property'"
uthark 24/03

chỉ đặt giá trị thành "gecko1_8" cho Firefox 1.5 và sau đó trong gwt 2.2
eaykin

Câu trả lời này đã gần hai tuổi. Hãy chỉnh sửa nó để làm rõ điểm này.
Yuval Adam

6
2013, vẫn còn thời gian biên dịch GWT, bất kỳ ai cũng có thể cải thiện câu trả lời này cho, GWT 2.5
Forhad

62

Nếu bạn chạy trình biên dịch GWT với cờ -localWorkers, trình biên dịch sẽ biên dịch song song nhiều hoán vị. Điều này cho phép bạn sử dụng tất cả các lõi của máy đa lõi, ví dụ -localWorkers 2 sẽ báo cho trình biên dịch thực hiện biên dịch hai hoán vị song song. Bạn sẽ không nhận được sự khác biệt về cường độ (không phải mọi thứ trong trình biên dịch đều có thể song song) nhưng nó vẫn là một tốc độ đáng chú ý nếu bạn biên dịch nhiều hoán vị.

Nếu bạn sẵn sàng sử dụng phiên bản trung kế của GWT, bạn sẽ có thể sử dụng chế độ được lưu trữ cho bất kỳ trình duyệt nào ( ngoài chế độ được lưu trữ ), giúp giảm bớt hầu hết các sự cố hiện tại với chế độ được lưu trữ. Đó dường như là nơi mà GWT đang diễn ra - luôn phát triển với chế độ được lưu trữ, vì các trình biên dịch không có khả năng nhận được cường độ nhanh hơn.


2
Ah, tùy chọn LocalWorkers là một viên ngọc quý, điều đó đáng để biết. Đáng buồn thay, hầu hết các hộp dev của chúng tôi là xe lõi đơn. OOPHM đó cũng có vẻ rất hứa hẹn. Luôn có trong phiên bản tiếp theo, đó là ...
skaffman

4
ảo hóa một môi trường biên dịch trên một hộp có nhiều lõi; từ xa vào vm này; thực thi biên dịch dòng lệnh GWT bằng cách sử dụng -localWorkers, với các địa phương và user.agents tối thiểu; đảm bảo hộp lưu trữ vm là mạng ngang hàng nơi bạn đang triển khai. Sự kết hợp này sẽ giúp bạn biên dịch xuống còn khoảng 30 giây với việc triển khai trong tomcat. Ngoài ra, tất cả những điều này có thể được viết trong một kịch bản. Bạn cũng có thể phát triển trên một máy cục bộ, tạo một bản vá svn và tập lệnh của bạn áp dụng bản vá bằng cách sử dụng một số loại chia sẻ NFS hoặc samba, loại bỏ nhu cầu sao chép chỉ các khác biệt src. vâng
kr.

NX client cũng là một +++ lớn cho nhà phát triển từ xa trên các kết nối ADSL, Cáp hoặc WiFi bị hạn chế. Ngoài ra, bạn luôn luôn đồng bộ cho dù bạn đang sử dụng máy tính nào ở bất kỳ vị trí nào trên mạng
kr.

mặc định cho nền tảng số lượng CPU có sẵn trong maven build. Vì vậy, không có tốc độ lên đây cho tôi.
keiki

55

Mặc dù mục này khá cũ và hầu hết các bạn có thể đã biết, tôi nghĩ rằng điều đáng nói là GWT 2.x bao gồm một cờ biên dịch mới giúp tăng tốc độ biên dịch bằng cách bỏ qua tối ưu hóa. Bạn chắc chắn không nên triển khai JavaScript được biên dịch theo cách đó, nhưng nó có thể tiết kiệm thời gian trong các bản dựng liên tục không sản xuất.

Chỉ cần bao gồm cờ: -draftCompile vào dòng trình biên dịch GWT của bạn.


3
Tôi đã sử dụng tùy chọn đó và trong dự án của chúng tôi đôi khi nó bị lỗi với một lỗi lạ. Vì vậy, hãy lưu ý rằng đôi khi việc biên dịch có thể không hoạt động vì điều này.
Vic

31

Dưới đây là danh sách các giá trị user.agent bạn có thể đặt thành.

(Thêm điều này vào đây bởi vì tôi tiếp tục kết thúc ở đây khi tôi tìm kiếm những gì tôi nên đặt để làm cho nó chỉ tạo ra một hoán vị cho chrome. Trả lời là <set-property name="user.agent" value="safari"/>:)


Tôi phải thêm yếu tố thuộc tính set này ở đâu? Tôi đã thử thêm nó vào bên trong và bên ngoài phần tử <module> trong tệp app.gwt.xml của tôi và nó không hoạt động.
Alex Worden

Nó đi trong tệp ABC.gwt.xml mô-đun của bạn trong đó ABC là tên mô-đun của bạn.
Glenn

30

Trong các phiên bản mới hơn của GWT (bắt đầu từ 2.3 hoặc 2.4, tôi tin), bạn cũng có thể thêm

<collapse-all-properties />

vào gwt.xml của bạn cho mục đích phát triển. Điều đó sẽ báo cho trình biên dịch GWT tạo ra một hoán vị duy nhất bao gồm tất cả các trình duyệt và trình duyệt. Do đó, bạn vẫn có thể kiểm tra trong tất cả các trình duyệt và ngôn ngữ, nhưng vẫn chỉ biên dịch một hoán vị duy nhất


2
Thú vị ... nhược điểm là gì?
skaffman

biên dịch một hoán vị duy nhất xử lý tất cả các trình duyệt và ngôn ngữ vẫn tốn ít thời gian hơn một hoán vị duy nhất chỉ xử lý một trình duyệt và ngôn ngữ, nhưng sự khác biệt không đáng kể trong trải nghiệm của tôi. (Thêm 25% nữa là những gì tôi đang thấy, nhưng đó vẫn là một cải tiến lớn so với việc biên dịch nhiều hoán vị)
Chi

Tôi không thể tìm thấy một liên kết doc cho điều này ... bạn có thể liên kết đến một cái gì đó không?
skaffman

Mặc dù thẻ này tăng tốc độ biên dịch, nó cũng phá vỡ quá trình gỡ lỗi trong Chế độ Super Dev (ít nhất là cho 2.6). Mã nguồn được hiển thị trong trình gỡ lỗi chrome khác với mã js đã biên dịch. Vì vậy, khi tôi đặt một điểm dừng trong một số phương thức java, trình gỡ lỗi dừng lại ở một phương thức khác.
damluar

18

Bạn có thể thêm một tùy chọn cho bản dựng của mình để sản xuất:

-localWorkers 8- Trong đó 8 là số lượng các luồng đồng thời tính toán hoán vị. Tất cả bạn phải làm là điều chỉnh số này thành số thuận tiện hơn cho bạn. Xem hiệu suất biên dịch GWT (nhờ bình luận của Dennis Ich).

Nếu bạn đang biên dịch sang môi trường thử nghiệm, bạn cũng có thể sử dụng:

-draftCompile cho phép biên dịch nhanh hơn nhưng tối ưu hóa ít hơn

-optimize 0 không tối ưu hóa mã của bạn (9 là giá trị tối ưu hóa tối đa)

Một điều nữa làm tăng gấp đôi hiệu suất chế độ xây dựng và lưu trữ là việc sử dụng đĩa SSD (hiện tại hostmode hoạt động như một bùa mê). Đây không phải là một giải pháp rẻ tiền, nhưng tùy thuộc vào mức độ bạn sử dụng GWT và chi phí thời gian của bạn, nó có thể xứng đáng!

Hy vọng điều này sẽ giúp bạn!


Đặt công nhân địa phương với số lượng lõi có thể rất không hiệu quả. Xem phần này để tham khảo: josephmarques.wordpress.com/2010/07/30/NH
Dennis Ich

Cảm ơn bạn đã bình luận Dennis. Trên thực tế, tôi có một ổ SSD và cho 2G bộ nhớ. Tất nhiên, số lượng LocalWorker phải được điều chỉnh theo từng trường hợp, tùy thuộc vào số lượng hoán vị, lõi, máy, v.v ... Trong trường hợp của tôi, khi tôi đang biên dịch trên máy tính xách tay của mình và muốn điều hướng trên web, nếu để lại 2 lõi miễn phí. Đó chỉ là một ví dụ. Tuy nhiên, sẽ chỉnh sửa bài viết của tôi để bao gồm ý tưởng của bạn. Cảm ơn.
martins.tuga

14

Trình biên dịch GWT đang thực hiện rất nhiều phân tích mã, do đó sẽ rất khó để tăng tốc nó. Phiên này từ Google IO 2008 sẽ cho bạn ý tưởng tốt về những gì GWT đang làm và tại sao nó lại mất nhiều thời gian như vậy.

Đề xuất của tôi là để phát triển sử dụng Chế độ lưu trữ càng nhiều càng tốt và sau đó chỉ biên dịch khi bạn muốn thực hiện thử nghiệm của mình. Điều này nghe có vẻ giống như giải pháp bạn đã thực hiện, nhưng về cơ bản đó là lý do tại sao Chế độ được lưu trữ ở đó (tốt, đó và gỡ lỗi).

Bạn có thể tăng tốc độ biên dịch GWT nhưng chỉ biên dịch cho một số trình duyệt, thay vì 5 loại mà GWT làm theo mặc định. Nếu bạn muốn sử dụng Chế độ lưu trữ, hãy đảm bảo bạn biên dịch cho ít nhất hai trình duyệt; nếu bạn biên dịch cho một trình duyệt thì mã phát hiện trình duyệt sẽ được tối ưu hóa và Chế độ lưu trữ sẽ không hoạt động nữa.

Một cách dễ dàng để định cấu hình biên dịch cho ít trình duyệt hơn là tạo mô-đun thứ hai kế thừa từ mô-đun chính của bạn:

<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>

Nếu rename-tothuộc tính được đặt giống nhau thì các tệp đầu ra sẽ giống như khi bạn biên dịch đầy đủ


11
  • Chia ứng dụng của bạn thành nhiều mô-đun hoặc điểm nhập cảnh và biên dịch lại sau đó chỉ khi cần thiết.
  • Phân tích ứng dụng của bạn bằng phiên bản trung kế - cung cấp Câu chuyện biên dịch của bạn . Điều này có thể có hoặc không liên quan đến trình biên dịch 1.6 nhưng nó có thể chỉ ra điều gì đang xảy ra.

Nhiều điểm nhập sẽ hoạt động, nhưng không phải mô-đun vì GWT luôn kiểm tra mọi thứ được kết nối với mã của bạn và biên dịch kết quả cuối cùng nguyên khối. Khung GWT là một mớ hỗn độn và ô nhục đối với các nguyên tắc mô đun hóa. Không tìm thấy một dự án tốt nào được sử dụng lại công cụ khung GWT.
dùng1050755

4

Đối với GWT 2.x tôi mới phát hiện ra rằng nếu bạn sử dụng

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

Bạn thậm chí có thể chỉ định nhiều hơn một hoán vị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.