PowerShell v4, 144 Byte
$d=date;gjb|rjb
1..20|%{sajb{$x=date;sleep 3;((date)-$x).Ticks/1e7}>$null}
while(gjb -s "Running"){}(gjb|rcjb)-join'+'|iex
((date)-$d).Ticks/1e7
Sets $d
gleich zu Get-Date
und löscht alle vorhandenen Auftragsprotokolle mit Get-Job | Remove-Job
. Wir durchlaufen dann eine Schleife 1..20|%{...}
und führen bei jeder Iteration Start-Job
den Skriptblock {$x=date;sleep 3;((date)-$x).ticks/1e7}
für den Job aus (dh, jeder Job führt diesen Skriptblock aus). Wir leiten diese Ausgabe an weiter >$null
, um das zurückgegebene Feedback (dh Jobname, Status usw.) zu unterdrücken.
Der Skriptblock setzt $x
auf Get-Date
, dann Start-Sleep
für 3
Sekunden, nimmt dann eine neue Get-Date
Lesung vor, subtrahiert $x
, erhält die .Ticks
und dividiert durch 1e7
, um die Sekunden zu erhalten (mit Genauigkeit).
Zurück im Hauptthread -S
drehen "Running"
wir uns in einer leeren while
Schleife , solange ein Job noch erledigt ist . Sobald dies erledigt ist, rufen wir Get-Job
Objekte für alle vorhandenen Jobs auf, Receive-Job
leiten diejenigen, an die STDOUT (dh was sie ausgeben), -join
die Ergebnisse zusammen mit STDOUT und leiten +
sie an iex
( Invoke-Expression
und ähnlich eval
). Dies gibt die resultierende Ruhezeit plus Overhead aus.
Die letzte Zeile ist insofern ähnlich, als sie ein neues Datum erhält, den ursprünglichen Datumsstempel subtrahiert $d
, den abruft .Ticks
und durch dividiert, um 1e7
die Gesamtausführungszeit auszugeben.
NB
OK, das ist also ein bisschen krumm von den Regeln. Anscheinend muss PowerShell bei der ersten Ausführung eine Reihe von .NET-Assemblys für die verschiedenen Thread-Vorgänge von der Festplatte laden, da sie nicht mit dem Standard-Shell-Profil geladen werden. Nachfolgende Ausführungen funktionieren einwandfrei, da sich die Assemblys bereits im Speicher befinden. Wenn Sie das Shell-Fenster lange genug im Leerlauf lassen, kann die integrierte Garbage Collection von PowerShell alle diese Assemblys entladen. Dies führt dazu, dass die nächste Ausführung beim erneuten Laden sehr lange dauert. Ich bin mir nicht sicher, wie ich das umgehen soll.
Sie können dies an den Ausführungszeiten in den folgenden Läufen ablesen. Ich startete eine neue Shell, navigierte zu meinem Golfverzeichnis und führte das Skript aus. Der erste Lauf war schrecklich, aber der zweite (sofort ausgeführt) hat gut funktioniert. Dann ließ ich die Shell einige Minuten im Leerlauf, damit die Garbage Collection vorbeikam, und dann ist dieser Lauf wieder langwierig, aber nachfolgende Läufe funktionieren wieder einwandfrei.
Beispiel läuft
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.
PS H:\> c:
PS C:\> cd C:\Tools\Scripts\golfing
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
63.232359
67.8403415
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.0809705
8.8991164
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
62.5791712
67.3228933
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.1303589
8.5939405
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.3210352
8.6386886
PS C:\Tools\Scripts\golfing>