PowerShell v4, 144 bajty
$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
Zestawy są $d
równe Get-Date
i usuwa wszystkie istniejące historie zadań Get-Job | Remove-Job
. Następnie zapętlamy 1..20|%{...}
i każda iteracja wykonuje Start-Job
przekazanie bloku skryptu {$x=date;sleep 3;((date)-$x).ticks/1e7}
dla zadania (co oznacza, że każde zadanie wykona ten blok skryptu). Przesyłamy dane wyjściowe do >$null
, aby ukryć informacje zwrotne (tj. Nazwę zadania, status itp.), Które zostaną zwrócone.
Blok skryptu ustawia się $x
na Get-Date
, potem Start-Sleep
na 3
sekundy, a następnie bierze nowy Get-Date
odczyt, odejmuje $x
, pobiera .Ticks
i dzieli przez, 1e7
aby uzyskać sekundy (z precyzją).
Z powrotem w głównym wątku, tak długo, jak każda praca jest nadal -S
tatus "Running"
, obracamy się w pustej while
pętli. Kiedy to zrobimy, będziemy Get-Job
pobierać obiekty dla wszystkich istniejących zadań, potokować te, do Receive-Job
których pobiorą ekwiwalent STDOUT (tj. To, co wyprowadzają), -join
wyniki wraz z +
, i potokować do iex
( Invoke-Expression
i podobnie do eval
). Spowoduje to wygenerowanie wynikowego czasu uśpienia plus narzutu.
Ostatnia linia jest podobna, ponieważ pobiera nową datę, odejmuje oryginalny znacznik daty $d
, pobiera .Ticks
i dzieli przez, 1e7
aby wyświetlić całkowity czas wykonania.
NB
OK, więc to trochę zgubne zasady. Najwyraźniej przy pierwszym uruchomieniu PowerShell musi załadować kilka zestawów .NET z dysku dla różnych operacji wątków, ponieważ nie są one ładowane z domyślnym profilem powłoki. Kolejne wykonania, ponieważ zestawy są już w pamięci, działają dobrze. Jeśli pozostawisz okno powłoki wystarczająco długo bezczynne, dostaniesz wbudowane zbieranie śmieci w PowerShell i usuniesz wszystkie te zespoły, co spowoduje, że następne wykonanie zajmie dużo czasu, gdy zostaną ponownie załadowane. Nie jestem pewien, jak to obejść.
Możesz to zobaczyć w czasach wykonania w poniższych uruchomieniach. Uruchomiłem nową powłokę, przeszedłem do katalogu golfa i wykonałem skrypt. Pierwszy bieg był przerażający, ale drugi (wykonany natychmiast) działał dobrze. Następnie pozostawiłem muszlę bezczynną na kilka minut, aby umożliwić przechodzenie do śmiecia, a potem ta kolejność jest znowu długa, ale kolejne serie znów działają dobrze.
Przykład działa
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>