Programmiersprache Julia 1.8 gibt tieferen Einblick in die Performance

Neben einem neuen Profiler und einem Tool zum Auswerten der Ladezeiten erweitert das Release das Inlining. Die Anbindung an Apple Silicon gilt zudem als stabil.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen

(Bild: kentoh / Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Sieben Monate nach Julia 1.7 ist Version 1.8 der Programmiersprache erschienen. Das Release bringt neue und erweiterte Werkzeuge für das Profiling mit. Außerdem gibt die Software einen tieferen Einblick in die Performance und die Dependencies beim Laden von Paketen. Hinsichtlich der Syntax lassen sich globale Variablen typisieren und das Inlining von Funktionen besser steuern.

Der Einsatz auf Apple Silicon ist nun als Tier 2 gekennzeichnet. Das ist die mittlere Support-Ebene, die angibt, dass der Build der Sprache auf der Plattform garantiert funktioniert, aber eventuell nicht alle Tests erfolgreich durchläuft. Offizielle Binaries sind fallabhängig verfügbar. In Version 1.7 war die Anbindung noch als experimentell gekennzeichnet und als Tier 3 markiert.

Julia zielt auf eine möglichst gute Performance und setzt dabei auf eine Kombination aus Optimierungen beim Kompilieren und Tipps zum Erstellen von performantem Code. Version 1.8 bringt mit dem Allocation-Profiler ein neues Tool mit, das einen tieferen Einblick in die Heap-Zuweisungen erlaubt als die ProfilerAnalyse mit dem Kommandozeilenparameter --track-allocation.

Das neue Werkzeug zeichnet die Zuweisungen auf dem Heap jeweils mit dem zugehörigen Typ, der Größe und dem Stacktrace auf. Die Daten lassen sich anschließend mit der Julia-Extension für Visual Studio Code oder mit dem Tool PProf.jl visualisieren.

Die Extension für Visual Studio Code zeigt die Daten des Heap-Allocation-Profilers.

(Bild: Julialang)

Hinsichtlich der Performance-Analyse bringt das Release zudem Ergänzungen für das CPU-Profiling, das nun Metadaten für die Thread- und Task-IDs aufzeichnet, um Berichte für spezifische Threads und Tasks zu erstellen und entsprechend zu gruppieren.

Ein weiteres neues Tool gibt Einblick in die Ladezeiten der Dependencies von Paketen. Dabei hebt es hervor, welche Zeit für das Rekompilieren ungültiger Methoden anfällt. Letztere sind in Julia keine Seltenheit, da der Compiler Methoden passend für den jeweiligen Sourcecode optimiert. Ergänzungen des Codes können dazu führen, dass die optimierten Methoden nicht mehr allgemein genug gültig sind, sodass der Compiler sie erneut übersetzen muss. Ein Blogbeitrag von 2020 beschäftigt sich mit der Method Invalidation in Julia.

Neu ist zudem, dass der Paketmanager anzeigt, wenn neue Versionen eines importierten Pakets verfügbar sind. Zwei Symbole markieren den Status der Pakete: Eins zeigt an, dass eine neue Version verfügbar ist und genutzt werden kann und das andere markiert Packages, für die zwar ein neues Release existiert, die Kompatibilitätsvorgaben anderer Pakete aber ein Update verhindern.

Symbole am linken Rand markieren, dass neue Versionen verfügbar sind, und zeigen an, ob ein Update möglich ist.

(Bild: Julialang)

Julia 1.8 bringt ein paar syntaktische Neuerungen mit. Unter anderem lässt sich das Inlining von Funktionen nun von der Aufruferseite her steuern. Die Inline-Ersetzung tauscht Funktionsaufrufe gegen den Funktionskörper aus, den der Compiler direkt in den Ablauf kopiert. Bisher war das Makro @inline nur für Methodendefinitionen und damit für alle Aufrufe gültig. Neuerdings sind auch Konstrukte wie inline f(x) zum Aufrufen erlaubt, sodass der Compiler nur für die markierten Aufrufe Inling verwendet und alle anderen durch reguläre Funktionsaufrufe übersetzt.

Eine kleine Änderung betrifft Structs: Innerhalb eines mit mutable als veränderlich gekennzeichneten struct sind neuerdings konstante Felder erlaubt. Das ermöglicht zum einen das Festlegen von Invarianten und bietet zum anderen dem Compiler zusätzliche Optimierungsmöglichkeiten.

Julia ist dynamisch typisiert, bietet aber teilweise die Option, eine Typisierung über :: in lokalen Deklarationen (local x::Int8) oder beim Zuweisen (x::Int8 = 10) vorzunehmen. Bisher waren Typ-Annotationen für globale Variablen beispielsweise für den Einsatz auf der REPL (Read-Eval-Print Loop) jedoch nicht möglich. Das ändert sich im aktuellen Release, wie folgendes Beispiel aus dem Julia-Blog zeigt:

julia> x::Int = 0
0

julia> x = "string"
ERROR: MethodError: Cannot `convert` an object of type String \
                    to an object of type Int64
...

Weitere Neuerungen in Julia 1.8 wie der Standard-Scheduler für @threads lassen sich dem Blogbeitrag zum Release der neuen Version entnehmen. Die komplette Liste der Änderungen findet sich im GitHub-Repository.

(rme)