Як пришвидшити компілятор gwt?


201

Ми починаємо все активніше використовувати GWT у наших проектах, а продуктивність компілятора GWT стає все більше дратівливою.

Ми почнемо змінювати свою практику роботи для усунення проблеми, включаючи більшу увагу на браузері розміщеного режиму, який визначає необхідність запускати компілятор GWT до більш пізнього часу, але це приносить свої ризики, особливо ризики не вирішувати проблеми з реальними браузерами набагато пізніше, ніж нам би хотілося.

В ідеалі, ми б хотіли зробити компілятор GWT швидшим - хвилина, щоб скласти досить невелику програму, вимагає жалю. Однак ми використовуємо компіляцію, якщо досить наївна мода, тому я сподіваюся, що ми зможемо досягти швидких та легких здобутків.

Наразі ми використовуємо com.google.gwt.dev.Compiler як програму java від цільової мурашиної мурашки, максимум у 256 м кучі та багато місця у стеці. Компілятор запускається Ant, використовуючи fork = true та найновіший Java 6 JRE, щоб спробувати скористатись покращеною продуктивністю Java6. Ми передаємо наш основний клас контролера компілятору разом із додатком classpath і вимикається.

Що ще ми можемо зробити, щоб отримати додаткову швидкість? Чи можемо ми дати їй більше інформації, щоб вона витрачала менше часу на відкриття того, що робити?

Я знаю, що ми можемо сказати, що він збирається лише для одного браузера, але нам потрібно провести тестування в декількох браузерах, так що це не дуже практично.

Всі пропозиції вітаються в цей момент.

Відповіді:


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" />
mooreds

У gwt 2.2 немає гекона. Компілятор зазначає, що "значення gecko раніше не було визначене. Неочікуваний виняток під час обробки елемента" set-властивість ""
uthark

встановлення значення "gecko1_8" має працювати лише для Firefox 1.5 і пізніше в gwt 2.2
eaykin

Цієї відповіді майже два роки. Не соромтесь відредагувати його, щоб уточнити цей момент.
Юваль Адам

6
2013 р., Все ще час збирання GWT зможе покращити цю відповідь, GWT 2.5
Forhad

62

Якщо ви запустите компілятор GWT із прапором -localWorkers, компілятор буде компілювати паралельно декілька перестановок. Це дозволяє використовувати всі ядра багатоядерної машини, наприклад -localWorkers 2 скаже компілятору зробити паралельно дві перестановки. Ви не отримаєте порядку різниць величин (не все в компіляторі є паралельним), але це все-таки помітне прискорення, якщо ви збираєте кілька перестановок.

Якщо ви готові використовувати магістральну версію GWT, ви зможете використовувати розміщений режим для будь-якого браузера ( поза режимом розміщення процесів ), що полегшує більшість поточних проблем із розміщеним режимом. Це здається, куди йде GWT - завжди розвивайтеся в розміщеному режимі, оскільки компіляції, швидше за все, не набирають масштабів швидше.


2
Ах, варіант місцевих робочих - це дорогоцінний камінь, про що варто знати. На жаль, більшість наших скриньок для розробників - це одноядерні ксеони. Цей OOPHM також виглядає дуже перспективно. Завжди в наступній версії, це ...
skaffman

4
віртуалізувати складаюче оточення на коробці з декількома ядрами; віддалений у цей vm; виконати компіляцію командного рядка GWT, використовуючи -localWorkers, з мінімальними локальними та user.agents; переконайтеся, що вікно, на якому розміщено vm, є мережевим аналогом, до якого ви розгортаєтесь. У поєднанні з цим компіляція зменшується до 30 секунд без розгортання в tomcat. Крім того, все це можна записати у сценарії. Ви також можете розробити на локальній машині, створити патч svn і дозволити своєму скрипту застосувати патч, використовуючи певний тип NFS або обміну samba, що усуває необхідність копіювання лише через src. так!
кр.

Клієнт NX - це також величезний +++ для віддалених розробників на обмежених ADSL, кабельних або Wi-Fi з'єднаннях. Крім того, ви завжди синхронізовані незалежно від того, яким комп’ютером ви користуєтесь у будь-якому місці з Інтернету
кр.

за замовчуванням до наявної на платформі кількості процесорів у Maven build. Так що швидкість тут не для мене.
keiki

55

Хоча цей запис досить старий, і більшість із вас, напевно, вже знає, я думаю, що варто згадати, що GWT 2.x включає новий прапор компіляції, який прискорює компіляцію, пропускаючи оптимізації. Ви точно не повинні розгортати компільований JavaScript таким чином, але це може бути економія часу під час невиробничих безперервних збірок.

Просто додайте прапор: -draftCompile до рядка компілятора GWT.


3
Я використовував цей варіант, і в нашому проекті іноді він провалювався із дивною помилкою. Тож майте на увазі, що іноді компіляція може не працювати через це.
Вік

31

Ось список значень user.agent, на який ви можете встановити його.

(Додавання цього тут , тому що я тримаю в кінцевому підсумку тут , коли я шукати то , що я повинен встановити , щоб зробити це тільки виробляти перестановку для хрому Відповідь :. <set-property name="user.agent" value="safari"/>)


Де я повинен додати цей елемент властивості set? Я спробував додати його всередині і зовні елемента <module> у файл app.gwt.xml, і він не працює.
Алекс Worden

Він входить у файл вашого модуля ABC.gwt.xml, де ABC - ваше ім'я модуля.
Гленн

30

У новіших версіях GWT (я вважаю, починаючи з 2.3 або 2.4), ви також можете додати

<collapse-all-properties />

на ваш gwt.xml з метою розвитку. Це скаже компілятору GWT створити єдину перестановку, яка охоплює всі локалі та браузери. Отже, ви все ще можете протестувати у всіх браузерах та на всіх мовах, але все ще зберігаєте лише одну перестановку


2
Цікаво ... у чому мінус?
skaffman

складання єдиної перестановки, яка обробляє всі браузери та мови, все ще займає трохи більше часу, ніж одна перестановка, яка обробляє лише один браузер і мову, але різниця не є істотною у моєму досвіді. (~ 25% більше - це те, що я бачу, але це все ще величезне поліпшення порівняно зі складанням декількох перестановок)
Chi

Я не можу знайти посилання на документ для цього ... Ви можете щось пов’язати?
skaffman

Хоча цей тег прискорює компіляцію, він також порушує налагодження в режимі Super Dev (принаймні для 2.6). Вихідний код, показаний у хромованому відладчику, відрізняється від компільованого js-коду. Тому коли я ставлю точку розриву в якомусь методі Java, налагоджувач зупиняється в іншому.
дамлюар

18

Ви можете додати один варіант до своєї збірки для виробництва:

-localWorkers 8- де 8 - кількість одночасних потоків, які обчислюють перестановки. Все, що вам потрібно зробити, - це пристосувати це число до зручнішого вам числа. Дивіться ефективність компіляції GWT (завдяки коментарю Денніса Іча).

Якщо ви збираєтесь у тестувальне середовище, ви також можете використовувати:

-draftCompile що дозволяє швидше, але менш оптимізовано складати

-optimize 0 який не оптимізує ваш код (9 - максимальне значення оптимізації)

Інша річ, що більш ніж удвічі збільшила продуктивність в режимі збірки та розміщеного режиму - використання диска SSD (зараз хостингмод працює як шарм). Це не дешеве рішення, але залежно від того, скільки ви використовуєте GWT та вартості свого часу, воно може того вартий!

Сподіваюся, це допоможе вам!


Встановлення місцевих працівників на кількість ядер може бути дуже малопродуктивним. Дивіться це для довідки: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich

Дякую за коментар Денніс Насправді у мене є SSD і даю 2G пам’яті. Зрозуміло, що кількість локальних робочих працівників повинна бути налаштована на кожен випадок, залежно від кількості перестановок, ядер, машини тощо ... У моєму випадку, коли я компілюю на своєму ноутбуці і хочу перейти в Інтернеті, якщо залиште 2 ядра вільними. Це лише приклад. Однак редагую мій пост, щоб включити вашу ідею. Дякую.
martins.tuga

14

Компілятор GWT робить багато аналізу коду, тому його буде важко пришвидшити. Цей сеанс з Google IO 2008 дасть вам гарне уявлення про те, що робить GWT і чому це займає так багато часу.

Моя рекомендація полягає в тому, щоб розробник використовував розміщений режим якомога більше, а потім компілювати лише тоді, коли ви хочете зробити тестування. Це виглядає як рішення, до якого ви вже прийшли, але в основному саме тому Hosted Mode є там (ну, це і налагодження).

Ви можете прискорити компіляцію 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.
користувач1050755

4

Для GWT 2.x я щойно виявив, що якщо ви користуєтесь

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

Можна навіть вказати більше однієї перестановки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.