Startbeschleunigung für die PowerShell 1.0

Ich muss es leider gestehen, aber ab und zu starte ich nach wie vor Cmd.exe, wenn ich mal eben die IP-Adressen wissen oder einen Ping-Befehl absetzen möchte. Der Hauptgrund ist die doch recht „lange“ Startzeit der PowerShell. Bis sie endlich einsatzbereit ist, vergehen in der Regel ein paar Sekunden (eigentlich kein Thema, doch als „Power-User“ kann es einem meistens nicht schnell genug gehen, auch wenn ich dann nicht selten ein paar Minuten darüber nachdenke, wofür ich die PowerShell denn eigentlich gestartet hatte).

Vor ein paar Tagen hat Jeffrey Snover im PowerShell-Teamblog ein interessantes Verfahren vorgestellt, mit dem sich der Start der PowerShell deutlich beschleuinigen lässt. Man muss es wirklich selber ausprobieren, um den Unterschied würdigen zu können.

Die Variante, die auf einer leicht verbeseserten Varianten (die in einem Kommentar zu dem Blog-Eintrag vorgestellt wurde), die auch den Umstand berücksichtigt, dass unter einem 64-Bit-Windows andere Verzeichnispfade vorliegen, lautet wie folgt:

write-host -fore yellow „Optimierung wird gestartet…“
Set-Alias ngen @(
 $ngen_path = Join-Path ${env:\windir} „Microsoft.NET\Framework“
  if(${env:PROCESSOR_ARCHITECTURE} -eq „AMD64“)
   { $ngen_path = Join-Path ${env:\windir} „Microsoft.NET\Framework64“}
    dir $ngen_path ngen.exe -recurse | where {$_.length -gt 0} |
    sort -descending lastwritetime )[0].fullName [appdomain]::currentdomain.getassemblies() |
    %{ngen /nologo $_.location}
write-host -fore yellow „Optimierung beendet…“

Die Hintergründe sind sehr technisch und müssen einen auch nicht interessieren, da das Skript pro PowerShell-Installation nur einmal ausgeführt werden muss (eine Mehrfachausführung schadet aber nicht). Das Skript geht alle Assembly-Bibliotheken durch, die von der PowerShell nach dem Start geladen werden, und konvertiert sie per Ngen.exe (einem Tool der .NET-Laufzeit) in aus Maschinencode bestehende Image, das schneller geladen wird als wenn die Assembly-Bibliotheken nach dem Start erst einmal „gejittet“ (also per JIT-Compiler in Maschinencode umgewandelt werden müssen). Das sind dann genau jene Sekunden, die den PowerShell-Start jedes Mal länger dauert. Wird das Skript, das selber „eine Weile“ zur Ausführung benötigt, so wie oben abgebildet ausgeführt, startet die PowerShell auf einmal fast genauso schnell wie Cmd.exe. So macht das Leben deutlich mehr Spaß.

Dass diese „Tuning-Maßnahme“ überhaupt erforderlich ist hat laut Jeffrey mit technischen Problemen bei der Fertigstellung der Version 1.0 zu tun. Bei der „V2“ der PowerShell wird sie nicht mehr erforderlich sein.

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s