Вопрос по java, gwt, performance – Как ускорить компилятор gwt?
===============================================================

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

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

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

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

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

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

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

Split your application into multiple modules or entry points and re-compile then only when needed.
Analyse your application using the trunk version - which provides the [Story of your compile](https://code.google.com/p/google-web-toolkit/wiki/CodeSplitting). This may or may not be relevant to the 1.6 compiler but it can indicate what's going on.



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

Если вы хотите использовать транковую версию GWT, вы сможете использовать хост-режим для любого браузера ([хост-режим вне процесса](https://code.google.com/p/google-web-toolkit/wiki/DesignOOPHM)), которая устраняет большинство текущих проблем с размещенным режимом. Похоже, именно в этом и заключается GWT - всегда развиваться в режиме хостинга, так как компиляции вряд ли получат величины быстрее.



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

```

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



 поэтому его будет сложно ускорить.[Эта сессия от Google IO 2008](https://www.youtube.com/watch?v=nvti32k4xyU) даст вам хорошее представление о том, что делает GWT и почему это занимает так много времени.

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

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

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

```
<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

```

Если`rename-to` атрибут устанавливается таким же, тогда выходные файлы будут такими же, как если бы вы сделали полную компиляцию



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

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



`-localWorkers 8` & # X2013;
Где 8 - количество одновременных потоков, которые вычисляют перестановки. Все, что вам нужно сделать, это настроить этот номер на более удобный для вас номер. Увидеть[Производительность компиляции GWT](https://josephmarques.wordpress.com/2010/07/30/gwt-compilation-performance/) (спасибо комментарию Денниса Ича).

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

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

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

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

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



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

[Управление взрывом перестановки: условные свойства](https://github.com/gwtproject/old_google_code_wiki/blob/master/ConditionalProperties.wiki.md)

[Управление перестановочным взрывом: SoftPermutations](https://github.com/gwtproject/old_google_code_wiki/blob/master/SoftPermutations.wiki.md)



 я полагаю), вы также можете добавить

```
<collapse-all-properties />

```

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



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



[Вот список значений user.agent](https://gwt.googlesource.com/gwt/+/master/user/src/com/google/gwt/useragent/UserAgent.gwt.xml) Вы можете установить его на.

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