Tuesday, September 3, 2013

Multicore JIT in .NET 4.5

Mehr zufällig als beabsichtigt bin ich beim Update meiner Paint.NET-Version auf das Multicore JIT-Feature in .NET 4.5 aufmerksam geworden. Rick Brewster, seines Zeichens Autor von Paint.Net, hat auf seinem Blog erklärt warum Paint.Net so schnell startet. Schließlich sind managed-Applikationen auch unter .NET dafür bekannt sich beim Startup gegenüber nativen Anwendungen etwas Zeit zu lassen.
Das hat eben auch mit der sog. Just-in-Time-Compilation (JIT) zu tun, da der Intermediate Language-Code (IL) zur Laufzeit auf die jeweilige native Proezssor-Architektur abgebildet werden muss. Historisch ist man dem auch schon mit NGen so zu Leibe gerückt, dass man direkt nach der Installation eine native Cross-Kompilierung durchgführt da die Zielarchitektur dann feststeht. Diesen Weg ist lange auch Rick Brewster mit Paint.Net gegangen. Ein anderes bekanntes Beispiel ist auch der Passwort-Manager KeePass beidem NGen als letzter Installatinosschritt "Optimize Startup performance" ausgeführt wird.

Wie also funktioniert Multicore JIT in .NET 4.5 und was bringt es? Zusammengefasst wird die Reihenfolge der zu kompilierenden Code-Blöcke in einem Profil-Lauf aufgezeichnet und die JIT-Kompilierung beim Start gemäß dieser Reihenfolge vorab auf mehrere Kerne verteilt. In gewisser Weise ist diese Art der Kompilierung also nicht mehr ganz so "just in time" da bestimmte Code-Teile ggf. schon kompiliert sind bevor sie ausgeführt werden wollen. Das Ergebnis ist allerdings beeindruckend: Im Schnitt halbiert man die Startzeit. Die zitierten Blogposts erklären dies weit ausführlicher.
Der Clou dabei: Ist das .NET 4.5 Framework installiert kann man Multicore JIT mit ein wenig Reflection auch in .NET 4.0 nutzen. Wie das geht hat Rick Brewster in dem oben angegebenen Post beschrieben.

No comments:

Post a Comment