Mit Lichtgeschwindigkeit (fast)

Gradle 3.4 veröffentlicht: Schneller builden denn je

Dominik Mohilo

© Gradle Inc.

Anfang des Jahres erschien mit Gradle 3.3 das letzte größere Release des Build Tools. Wie bereits im Vorgänger geht es bei Gradle 3.4 wieder in erster Linie um eine verbesserte Performance, respektive Geschwindigkeit. Wir haben uns angesehen, was die Macher des Tools diesmal getuned haben.

In der aktuellen Version von Gradle, die nur zwei Monate nach dem Vorgänger erschienen ist, stand erneut die Performance im Vordergrund. Mit drei neuen Features wollen die Macher das Build Tool weiter beschleunigen und damit die Arbeit von Entwicklern erleichtern. Neben einem neuen Java-Library-Plug-in hat Gradle 3.4 einen stabilen inkrementellen Java-Compiler an Bord. Das Trio wird durch die neue Compile Avoidance komplettiert.

Compile Avoidance

Die Compile Avoidance, die im aktuellen Release enthalten ist, ist ein neuer Mechanismus für das up-to-date Checking einer Java-Kompilierung, die nur in Bezug auf Änderungen am public API empfindlich ist. Wird lediglich ein privates API verändert oder ein Kommentar bearbeitet, bleiben die Java-Kompilierungstasks ab sofort up-to-date.

Wenn also ein Projekt A abhängig von einem Projekt B ist und in Projekt B eine Klasse in einer ABI-kompatiblen Art geändert wird, kompiliert Gradle Projekt A nicht erneut. Meist geht es bei solchen ABI-kompatiblen Änderungen um das Bearbeiten eines Method-Bodies.

Hierdurch kann die Zeit für das inkrementelle Builden verbessert werden, da Gradle nun die Rekompilierung von Quelldateien umgeht, was ansonsten den gleichen Bytecode produzieren würde, wie zuvor.

Incremental Java Compiler

Der Umgang des inkrementellen Java-Compilers mit Konstanten wurde verbessert und das Rekompilieren wird unter gewissen Umständen verhindert:

  1. Wenn eine Konstante in einer Dependency gefunden, aber nicht im Code verwendet wird.
  2. Wenn eine Konstante in einer Dependecy verändert, aber nicht im Code verwendet wird.
  3. Wenn etwas in einer Klasse verändert wird, die eine Konstante enthält, aber der Wert dieser Konstante nicht verändert wurde.

Außerdem wird nur ein kleiner Teil der potentiell betroffenen Klassen in Gradle 3.4 vom inkrementellen Compiler erneut kompiliert. Der inkrementelle Compiler ist nun auch effizienter und wird von In-Memory-Caches unterstützt, was eine Menge sogenannter Disk I/Os verhindert, die zuvor für eine Verlangsamung sorgten.

Java Library Plug-in

Zu guter Letzt gibt es auch ein neues Java-Library-Plug-in, was für das Erstellen einer Komponente genutzt werden kann, die als Dependency für ein anderes Projekt verwendet werden soll. Das Plug-in sorgt für eine starke Separation zwischen public Code und private Code. Dadurch wird eine starke Verbesserung der Performanz erreicht und architektonische Grenzen werden auf dem Build-Level festgesetzt.

In Zahlen…

In Zahlen ausgedrückt sieht das Ganze natürlich sehr viel beeindruckender aus: Das Gradle-Team hat die neue Version testweise für ihr großes perf-enterprise-large Java-Benchmarkprojekt benutzt. Die Zeit für das Kompilieren betrug nach einem Body Change nur noch 9 Sekunden; zuvor mussten hierfür etwa 2.5 Minuten eingeplant werden.

Performance in Zahlen / Quelle: Gradle Doc

Performance in Zahlen / Quelle: Gradle Doc

Doch nicht nur riesige Projekte profitieren von den Verbesserungen. Der gleiche Use Case auf Apache Polygene angewandt verkürzte die Kompilierzeit von 14 auf 7 Sekunden – eine Ersparnis von immerhin 50 Prozent.

Eine vollständige Liste mit Änderungen, Verbesserungen und Bugfixes gibt es in der Dokumentation von Gradle. Herunterladen und installieren kann man Gradle 3.4 über die offizielle Homepage.

Lesen Sie auch: 8 Build-Tools im Vergleich: Ant – Buildr – Maven – Bazel – Buck – Gradle – Pants – sbt

Verwandte Themen:

Geschrieben von
Dominik Mohilo
Dominik Mohilo
Dominik Mohilo studierte Germanistik und Soziologie an der Goethe-Universität in Frankfurt. Seit 2015 ist er Redakteur bei S&S-Media.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.