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




такое widgets (9)

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

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

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

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

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

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

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


Answers

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

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

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


Компилятор 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 устанавливается одинаковым, выходные файлы будут такими же, как если бы вы выполнили полную компиляцию


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

<collapse-all-properties />

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


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

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


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

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

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


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

Просто добавьте флаг: -draftCompile к вашей линии компилятора GWT.


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

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


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





java performance gwt