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

198

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

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

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

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

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

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

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

Ваш Ответ

10   ответов
11
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. This may or may not be relevant to the 1.6 compiler but it can indicate what's going on.
Этот материал SOYC выглядит аккуратно, спасибо за совет. skaffman
Должны работать несколько точек входа, но не модули, потому что GWT всегда проверяет все, что связано с вашим кодом, и компилирует монолитный конечный результат. Структура GWT - беспорядок и позор принципам модульности. Не нашел ни одного хорошего проекта, в котором повторно использовались бы фреймворки GWT.
60

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

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

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

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

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

14

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

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

142

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

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

@YuvalAdam, связанные блоги больше не указывают на действительные сайты.
В gwt 2.2 нет геккона. Компилятор утверждает, что & quot; значение gecko не было предварительно определено. Неожиданное исключение при обработке элемента «set-property» »
2013, все еще отстой GWT компиляция может любой улучшить этот ответ для, GWT 2.5
Похоже, для GWT 2.0 вы действительно хотите, чтобы этот синтаксис определял пользовательский агент: & lt; set-property name = & quot; user.agent & quot; значение = & Quot; геккон, gecko1_8 & Quot; / & GT;
установка значения "gecko1_8" должен работать только для Firefox 1.5 и более поздних версий в gwt 2.2
15

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

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

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

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

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

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

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

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

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

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

milind_db, вышеупомянутые ссылки не работают. Не могу найти источник где-либо.
30

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

<collapse-all-properties />

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

54

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

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

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

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

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

Где я должен добавить этот элемент set-property? Я пытался добавить его внутри и снаружи модуля & lt; module & gt; элемент в моем файле app.gwt.xml, и он не работает.
Он находится в файле вашего модуля ABC.gwt.xml, где ABC - это имя вашего модуля.

Похожие вопросы