Быстрее Buck от Facebook


Facebook добавил новую функцию в Buck, свою систему быстрой сборки с открытым исходным кодом. Это дополнение можно использовать для ускорения компиляции проектов Android.

Buck — это система сборки, разработанная и используемая Facebook. Он оптимизирован для создания небольших многократно используемых модулей, состоящих из кода и ресурсов, и поддерживает множество языков и платформ. Первоначально он был открыт четыре года назад и с тех пор постепенно улучшался как Facebook, так и разработчиками сообщества. Однако, по словам Джонатана Кейджо из Facebook, эти улучшения были следующими:
«поэтапный по своей природе и основанный на давних предположениях о том, как работает разработка программного обеспечения».
По словам Кейджо, размышляя о том, как продвинуть Бак вперед, разработчики Facebook смотрели на более широкую картину и подвергали сомнению свои основные предположения:
«что привело нас к более глубокому изучению нюансов языка Java и внутреннего устройства компилятора Java. В конце концов, мы полностью переосмыслили способ компиляции кода Java Баком, добившись недостижимого прироста производительности за счет постепенных улучшений».
Повышение скорости было достигнуто за счет изменения способа, которым Buck игнорирует элементы кода, которые не изменились при выполнении инкрементных сборок. Разработчики, использующие Buck, могут устанавливать правила сборки для различных частей своего приложения, при этом некоторые правила зависят от правил, находящихся на более высоких уровнях цепочки. Buck кэширует выходные данные каждого правила, и когда он обнаруживает изменение в выходных данных правила, он идентифицирует и перестраивает только зависимые правила.
Если правило компилирует код Java, Buck (до сих пор) выполнял базовое сравнение выходного файла JAR и, если он отличался от кэшированного, перестраивал его вместе с любыми правилами, указанными как зависимые. Однако многие изменения исходного кода Java могут привести к созданию другого файла JAR, но фактически не повлияют на правила ниже по строке зависимости. Одним из распространенных примеров этого является ситуация, когда иждивенцы не используют все классы в правиле, но Бак будет перестраивать все иждивенцы при изменении любого класса в JAR более высокого уровня.
Новая версия Buck была обучена определять, какие классы используются правилом, путем отслеживания того, какие классы читаются компилятором Java. Теперь Бак кодирует эту информацию в файлах зависимостей, чтобы искать изменения только в этих классах при принятии решения о том, что перестраивать. Эта функция называется «генерацией заглушек только для исходного кода», и это одна из основных вещей, которая делает новую версию намного быстрее.
Еще одно улучшение — устранение узких мест при построении нескольких правил. Если для построения часто используемого правила требуется время, его зависимые элементы должны подождать. Однако, поскольку компилятор Java фактически имеет всю информацию, необходимую для создания заглушки JAR примерно на полпути, Buck может позволить зависимым правилам начать компиляцию, пока компилятор все еще завершает свои зависимости.
Новая более быстрая версия доступна на веб-сайте BuckBuild, а также содержит инструкции по обеспечению совместимости вашего кода и сценарий автоисправления, который сделает большую часть работы за вас.


Добавить комментарий