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

201

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

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

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

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

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

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

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

skaffman
источник

Ответы:

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" />
пришвартовался
В gwt 2.2 нет геккона. Компилятор утверждает, что «значение gecko не было ранее определено. Неожиданное исключение при обработке элемента« set-property »»
uthark
установка значения «gecko1_8» должна работать только для Firefox 1.5 и более поздних
версий
Этому ответу почти два года. Не стесняйтесь редактировать это, чтобы разъяснить этот пункт.
Ювал Адам
6
2013, все еще отстой GWT время компиляции может любой улучшить этот ответ, GWT 2.5
Forhad
62

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

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

Chi
источник
2
Ах, опция localWorkers - это жемчужина, которую стоит знать. К сожалению, большинство наших dev-блоков - одноядерные xeons. Этот ООФМ тоже выглядит очень многообещающе. Всегда в следующей версии, это ...
Скаффман
4
виртуализировать среду компиляции на коробке с несколькими ядрами; удаленный в этот vm; выполнить GWT-компиляцию командной строки, используя -localWorkers, с минимальным количеством локальных и пользовательских.агентов; убедитесь, что ящик, на котором находится виртуальная машина, является сетевым узлом, куда вы развертываете. Сочетание этого сокращает время компиляции до 30 секунд с развертыванием в tomcat. Кроме того, все это можно записать в сценарии. Вы также можете разрабатывать на локальной машине, создавать svn-патч, и ваш скрипт должен применить патч, используя какой-либо тип NFS или общий доступ к samba, исключая необходимость копировать только src diff. ура!
кр.
NX-клиент также является огромным +++ для удаленного разработчика по ограниченным ADSL, кабельным или WiFi соединениям. Кроме того, вы всегда синхронизированы независимо от того, какой комп вы используете в любом месте с интернетом
кр.
по умолчанию используется доступное количество платформ в платформе maven. Так что нет скорости для меня.
Кейки
55

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

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

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

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

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

Стивен
источник
Где я должен добавить этот элемент set-property? Я попытался добавить его внутри и снаружи элемента <module> в моем файле app.gwt.xml, и он не работает.
Алекс Уорден
Он находится в файле вашего модуля ABC.gwt.xml, где ABC - это имя вашего модуля.
Гленн
30

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

<collapse-all-properties />

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

Chi
источник
2
Интересно ... в чем минус?
Скаффман
компиляция одной перестановки, которая обрабатывает все браузеры и языки, все же занимает немного больше времени, чем одна перестановка, которая обрабатывает только один браузер и язык, но в моем опыте разница не значительна. (~ 25% - это то, что я вижу, но это все еще огромное улучшение по сравнению с компиляцией нескольких перестановок)
Chi
Я не могу найти ссылку на документацию для этого ... вы можете ссылаться на что-то?
Скаффман
Хотя этот тег ускоряет компиляцию, он также прерывает отладку в режиме Super Dev (по крайней мере, для версии 2.6). Исходный код, показанный в отладчике Chrome, отличается от скомпилированного кода JS. Поэтому, когда я ставлю точку останова в каком-либо java-методе, отладчик останавливается в другом методе.
Дамлуар
18

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

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

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

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

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

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

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

martins.tuga
источник
Задание местным рабочим количества ядер может быть очень непродуктивным. См. Это для справки: josephmarques.wordpress.com/2010/07/30/…
Деннис
Спасибо за комментарий Деннис. На самом деле у меня есть SSD и дают 2G памяти. Конечно, количество localWorker должно быть настроено для каждого случая, в зависимости от количества перестановок, ядер, машины и т. Д. В моем случае, когда я собираю на своем ноутбуке и хочу перемещаться по сети, если оставьте 2 ядра свободными. Это всего лишь пример. Тем не менее, отредактирую мой пост, чтобы включить вашу идею. Спасибо.
martins.tuga
14

Компилятор 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
  • Разделите ваше приложение на несколько модулей или точек входа и перекомпилируйте его только тогда, когда это необходимо.
  • Проанализируйте ваше приложение, используя версию магистрали - которая предоставляет историю вашей компиляции . Это может относиться или не относиться к компилятору 1.6, но может указывать на то, что происходит.
Роберт Мунтяну
источник
Должны работать несколько точек входа, но не модули, потому что GWT всегда проверяет все, что связано с вашим кодом, и компилирует монолитный конечный результат. Структура GWT - беспорядок и позор принципам модульности. Не нашел ни одного хорошего проекта, который бы повторно использовал материал фреймворка GWT.
user1050755
4

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

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

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

CCarpo
источник