Подтвердить что ты не робот

Как ускорить компилятор gwt?

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

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

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

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

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

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

Все предложения приветствуются на этом этапе.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Если вы хотите использовать магистральную версию GWT, вы сможете использовать режим размещения для любого браузера (

Ответ 3

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

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

Ответ 4

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

<collapse-all-properties />

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

Ответ 5

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

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

Ответ 6

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

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

Вы можете ускорить компиляцию GWT, но только компиляцию для некоторых браузеров, а не 5 видов, которые GWT делает по умолчанию. Если вы хотите использовать Hosted Mode, убедитесь, что вы компилируете, по крайней мере, два браузера; если вы компилируете для одного браузера, тогда код обнаружения браузера оптимизируется, а затем режим 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 установлен одинаковым, выходные файлы будут такими же, как если бы вы выполнили полную компиляцию

Ответ 7

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

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

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

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

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

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

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

Ответ 8

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

Ответ 10

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

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

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