Как ускорить компилятор gwt?
Мы начинаем более активно использовать GWT в наших проектах, а производительность компилятора GWT становится все более раздражающей.
Мы начнем изменять наши рабочие методы для устранения проблемы, включая больший акцент на браузере с размещенным режимом, который откладывает необходимость запуска компилятора GWT до более позднего времени, но это приводит к собственным рискам, особенно к не улавливая проблем с реальными браузерами до гораздо позже, чем хотелось бы.
В идеале мы хотели бы сделать сам компилятор GWT быстрее – минутку для составления довольно небольшого приложения – это вздор. Однако мы используем компиляцию, если она довольно наивная, поэтому я надеюсь, что мы сможем сделать быстрый и легкий выигрыш.
- Почему первый вызов WCF-клиента замедляется?
- shared_ptr: ужасная скорость
- Эффективный способ хранения дерева Хаффмана
- Производительность Java try / catch, рекомендуется ли сохранить то, что находится внутри предложения try, до минимума?
- Почему LINQ JOIN намного быстрее, чем связывание с WHERE?
Мы в настоящее время вызываем com.google.gwt.dev.Compiler как приложение java из Ant Ant-цели, с максимальной емкостью 256m и большим количеством стеков. Компилятор запускается Ant, используя fork = true и последнюю версию Java 6 JRE, чтобы попытаться воспользоваться улучшенной производительностью Java6. Мы передаем наш основной class controllerа компилятору вместе с путём classа приложения и от него.
Что еще мы можем сделать, чтобы получить дополнительную скорость? Можем ли мы дать ему больше информации, чтобы тратить меньше времени на открытие того, что делать?
Я знаю, что мы можем сказать, что это только компиляция для одного браузера, но нам нужно сделать многосерверное тестирование, так что это не очень практично.
Все предложения приветствуются на этом этапе.
- Когда JVM будет использовать встроенные средства
- Внедряет ли Java кастинг накладные расходы? Зачем?
- Производительность SQLite .NET, как ускорить работу?
- Как читать большой текстовый файл по строкам с помощью Java?
- Если против скорости переключения
- Увеличить производительность виртуальных машин на 27 "imac
- Как ускорить мой компьютер для просмотра нескольких вкладок?
- Почему LINQ .Where (предикат) .First () быстрее, чем .First (предикат)?
Начнем с неудобной истины: производительность компилятора GWT действительно отвратительна. Вы можете использовать некоторые хаки здесь и там, но вы не получите значительно лучшую производительность.
Хороший взлом производительности, который вы можете сделать, состоит в компиляции только для определенных браузеров, вставив следующую строку в свой gwt.xml
:
или в синтаксисе gwt 2.x, и только для одного браузера:
Это, например, будет компилировать ваше приложение только для IE и FF. Если вы знаете, что используете только определенный браузер для тестирования, вы можете использовать этот маленький взлом.
Другой вариант: если вы используете несколько локалей и снова используете только один для тестирования, вы можете прокомментировать их все, чтобы GWT использовал локаль по умолчанию, это избавляет от некоторых дополнительных накладных расходов от времени компиляции.
Итог: вы не собираетесь получать прирост производительности компилятора по порядку величины, но, принимая несколько релаксаций, вы можете сбрить несколько минут здесь и там.
Если вы запустите компилятор GWT с флагом -localWorkers, компилятор будет скомпилировать несколько перестановок параллельно. Это позволяет использовать все ядра многоядерной машины, например -localWorkers 2 сообщит компилятору, что он будет выполнять компиляцию двух перестановок параллельно. Вы не получите порядок разностей величин (не все в компиляторе параллелизуемо), но это все же примечательное ускорение, если вы компилируете несколько перестановок.
Если вы захотите использовать магистральную версию GWT, вы сможете использовать режим размещения для любого браузера ( вне режима работы в хостинге ), что облегчает большинство текущих проблем в режиме размещения. Кажется, именно там, где идет GWT, всегда развивается в режиме размещения, так как компиляции вряд ли будут получать величины быстрее.
Хотя эта запись довольно старая, и большинство из вас, вероятно, уже знают, я думаю, стоит упомянуть, что GWT 2.x включает новый флаг компиляции, который ускоряет компиляцию, пропуская оптимизацию. Вы определенно не должны развертывать JavaScript, скомпилированный таким образом, но это может быть экономией времени во время непроизводственных непрерывных сборок.
Просто добавьте флаг: -draftCompile к вашей линии компилятора GWT.
В более новых версиях GWT (начиная с 2.3 или 2.4, я считаю) вы также можете добавить
к вашему gwt.xml для целей развития. Это скажет компилятору GWT создать единую перестановку, которая охватывает все локали и браузеры. Таким образом, вы все еще можете тестировать во всех браузерах и языках, но по-прежнему составляете только одну перестановку
Вот список значений user.agent, которые вы можете установить.
(Добавление этого здесь, потому что я продолжаю заканчивать здесь, когда я ищу то, что должен установить, чтобы он производил только перестановку для chrome. Ответ:
)
Вы можете добавить один вариант своей сборки для производства:
-localWorkers 8
– Где 8 – количество параллельных streamов, которые вычисляют перестановки. Все, что вам нужно сделать, – это настроить этот номер на более удобный для вас номер. См. Производительность компиляции GWT (спасибо комментарию Денниса Ich).
Если вы компилируете среду тестирования, вы также можете использовать:
-draftCompile
который обеспечивает более быструю, но менее оптимизированную компиляцию
-optimize 0
который не оптимизирует ваш код (9 – максимальное значение оптимизации)
Еще одна вещь, которая более чем удвоила производительность сборки и размещения в режиме реального времени, – это использование SSD-диска (теперь hostmode работает как шарм). Это не дешевое решение, но в зависимости от того, насколько вы используете GWT и стоимость вашего времени, это может стоить того!
Надеюсь, это поможет вам!
Компилятор GWT проводит много анализа кода, поэтому его будет сложно ускорить. Этот сеанс из Google IO 2008 даст вам хорошее представление о том, что делает GWT и почему он так долго.
Моя рекомендация заключается в том, чтобы вы максимально использовали Hosted Mode, а затем только компилируете, когда хотите провести тестирование. Это похоже на решение, к которому вы уже пришли, но в основном именно поэтому Hosted Mode (ну, это и отладка).
Вы можете ускорить компиляцию GWT, но только компиляцию для некоторых браузеров, а не 5 видов, которые GWT делает по умолчанию. Если вы хотите использовать Hosted Mode, убедитесь, что вы компилируете, по крайней мере, два браузера; если вы компилируете для одного браузера, тогда код обнаружения браузера оптимизируется, а затем режим Hosted Mode больше не работает.
Простым способом настройки компиляции для меньшего количества браузеров является создание второго модуля, который наследуется от вашего основного модуля:
Если атрибут rename-to
устанавливается одинаковым, выходные файлы будут такими же, как если бы вы выполнили полную компиляцию
- Разделите приложение на несколько модhive или точек входа и перекомпилируйте его только тогда, когда это необходимо.
- Проанализируйте свое приложение, используя версию trunk, которая предоставляет Историю вашего компиляции . Это может быть или не иметь отношения к компилятору 1.6, но может указывать на то, что происходит.
Управление перестановками компиляции будет полезно, пожалуйста, перейдите по ссылкам, которые подробно объясняют это:
Управление взломом подстановки: ConditionalProperties
Управление взрывом перестановки: SoftPermutations
Для GWT 2.x я просто обнаружил, что если вы используете
Вы даже можете указать несколько перестановок.