Как ускорить компилятор gwt? - PullRequest
199 голосов
/ 18 июня 2009

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

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

В идеале, мы бы хотели ускорить сам GWT-компилятор - минута на компиляцию довольно небольшого приложения приносит свои плоды. Тем не менее, мы используем компиляцию, если это довольно наивно, поэтому я надеюсь, что мы сможем быстро и легко добиться успеха.

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

Что еще мы можем сделать, чтобы получить дополнительную скорость? Можем ли мы дать ему больше информации, чтобы он меньше занимался поиском того, что делать?

Я знаю, что мы можем сказать, чтобы он компилировался только для одного браузера, но нам нужно выполнить тестирование нескольких браузеров, так что это не очень практично.

На данный момент приветствуются все предложения.

Ответы [ 10 ]

143 голосов
/ 18 июня 2009

Начнем с неудобной правды: производительность компилятора 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 использовал языковой стандарт по умолчанию, это снижает некоторые дополнительные издержки во время компиляции.

Итог: вы не получите увеличения производительности компилятора на порядок, но, сделав несколько послаблений, вы можете сэкономить несколько минут здесь и там.

60 голосов
/ 18 июня 2009

Если вы запускаете компилятор GWT с флагом -localWorkers, компилятор будет компилировать несколько перестановок параллельно. Это позволяет вам использовать все ядра многоядерного компьютера, например, -localWorkers 2 сообщит компилятору выполнить компиляцию двух перестановок параллельно. Вы не получите разницы в порядке величин (не все в компиляторе распараллеливается), но это все равно заметное ускорение, если вы компилируете несколько перестановок.

Если вы хотите использовать транковую версию GWT, вы сможете использовать хост-режим для любого браузера ( вне процесса хост-режима ), что устраняет большинство текущих проблем размещенный режим. Похоже, именно в этом и заключается GWT - всегда разрабатывать в режиме хостинга, поскольку компиляции вряд ли получат величины быстрее.

55 голосов
/ 03 мая 2010

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

Просто включите флаг: -draftCompile в строку компилятора GWT.

30 голосов
/ 21 ноября 2011

В более новых версиях GWT (начиная с 2.3 или 2.4, я полагаю), вы также можете добавить

<collapse-all-properties />

в ваш gwt.xml для целей разработки. Это скажет компилятору GWT создать одну перестановку, которая будет охватывать все локали и браузеры. Таким образом, вы все еще можете тестировать во всех браузерах и языках, но все еще только компилируете одну перестановку

30 голосов
/ 08 мая 2011

Вот список значений user.agent , которые вы можете установить.

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

15 голосов
/ 06 марта 2013

Вы можете добавить один вариант в свою сборку для производства:

-localWorkers 8 - Где 8 - количество одновременных потоков, которые вычисляют перестановки. Все, что вам нужно сделать, это настроить этот номер на более удобный для вас номер. См. производительность компиляции GWT (спасибо комментарию Денниса Ича).

Если вы компилируете в среду тестирования, вы также можете использовать:

-draftCompile, что обеспечивает более быструю, но менее оптимизированную компиляцию

-optimize 0, который не оптимизирует ваш код (9 - максимальное значение оптимизации)

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

Надеюсь, это поможет вам!

14 голосов
/ 18 июня 2009

Компилятор GWT много анализирует код, поэтому его будет сложно ускорить. Этот сеанс от Google IO 2008 даст вам хорошее представление о том, что делает GWT и почему это занимает так много времени.

Я рекомендую для разработки использовать как можно больше Hosted Mode, а затем компилировать его только тогда, когда вы хотите провести тестирование. Это похоже на решение, к которому вы уже пришли, но в основном именно поэтому есть Hosted Mode (ну, это и отладка).

Вы можете ускорить компиляцию GWT, но компиляцию только для некоторых браузеров, а не 5 видов, которые GWT делает по умолчанию. Если вы хотите использовать Hosted Mode, убедитесь, что вы скомпилировали как минимум два браузера; если вы компилируете для одного браузера, тогда код обнаружения браузера оптимизируется, а затем режим хоста больше не работает.

Простой способ настроить компиляцию для меньшего количества браузеров - создать второй модуль, который наследуется от вашего основного модуля:

<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 голосов
/ 18 июня 2009
  • Разделите ваше приложение на несколько модулей или точек входа и перекомпилируйте его только тогда, когда это необходимо.
  • Анализируйте ваше приложение, используя версию транка - которая предоставляет Story вашей компиляции . Это может относиться или не относиться к компилятору 1.6, но может указывать на то, что происходит.
5 голосов
/ 05 июня 2012

Контроль перестановок компиляции будет полезен, пожалуйста, перейдите по следующим ссылкам, которые объясняют то же самое в деталях:

Управление взрывом перестановки: условные свойства

Управление взрывом перестановки: SoftPermutations

4 голосов
/ 21 февраля 2011

Для GWT 2.x я только что обнаружил, что если вы используете

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

Вы даже можете указать более одной перестановки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...